请诸位高手帮我看看这两个函数,看有没有错误啊?!

ww012 2004-07-06 10:15:39
为什么我得到图像是空的啊?!郁闷啊?!
yv12torgb(char *pchYuvBuff, char *pchR, char *pchG, char *pchB, int nWidth, int nHeight)//YV12转RGB分量
{
char y,u,v,R,G,B;
char *bufy = pchYuvBuff;
char *bufu = pchYuvBuff + nWidth* nHeight;
char *bufv = pchYuvBuff + nWidth* nHeight * 3/2;

int nIndex=0;
for(int h = 0; h < nHeight; h++)
{
for(int w=0;w<nWidth;w++)
{
y = bufy [w];
u = bufu [w >> 1] - 128;
v = bufv [w >> 1] - 128;

R = y + 1.375 * v;
G = y - 0.34375 * u - 0.703125 * v;
B = y + 1.734375 * u;

R = max (0, min (255, R));
G = max (0, min (255, G));
B = max (0, min (255, B));

pchR[nIndex+w]=R;
pchG[nIndex+w]=G;
pchB[nIndex+w]=B;

}
nIndex+=nWidth;
}
}

OnButton2()//RGB分量转成BMP图像
{
char R[352*288];
char G[352*288];
char B[352*288];
int w=352;
int h=288;
yv12torgb(yuv,R,G,B,w,h);
long m_WidthOfModel=352;
long m_HeightOfModel=288;
BITMAPFILEHEADER bmfHdr; //定义文件头
BITMAPINFOHEADER bmiHdr; //定义信息头

//对信息头进行赋值
bmiHdr.biSize = sizeof(BITMAPINFOHEADER);
bmiHdr.biWidth = m_WidthOfModel;
bmiHdr.biHeight = m_HeightOfModel;
bmiHdr.biPlanes = 1;
bmiHdr.biBitCount = 24;
bmiHdr.biCompression = BI_RGB;
bmiHdr.biSizeImage = m_WidthOfModel* 3 * m_HeightOfModel; bmiHdr.biXPelsPerMeter = 0;
bmiHdr.biYPelsPerMeter = 0;
bmiHdr.biClrUsed = 0;
bmiHdr.biClrImportant = 0;

//对文件头进行赋值
bmfHdr.bfType = (WORD)0x4D42;//;((WORD)('M'<<8) | 'B')
bmfHdr.bfSize=(DWORD)(sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER) + m_WidthOfModel* 3 * m_HeightOfModel);//24Bit没色彩表
bmfHdr.bfReserved1 = 0;
bmfHdr.bfReserved2 = 0;
bmfHdr.bfOffBits=(DWORD)(sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER));

//保存文件
CFile fp;
fp.Open("f:\\Model.bmp",CFile::modeCreate | CFile::modeWrite);
fp.Write((LPSTR)&bmfHdr,sizeof(BITMAPFILEHEADER)); //写文件头
fp.Write((LPSTR)&bmiHdr,sizeof(BITMAPINFOHEADER)); //写信息头
WORD nWdith = 352;
WORD nHeight = 288;
WORD WidthBytes = 352 * 3;
char *pData = (char *)new char[WidthBytes * nHeight];

char *pLine = NULL;
DWORD Q = 0;

for(int i = nHeight - 1;i >= 0;--i)
{
pLine = pData + i * WidthBytes;
for(int j = 0;j < nWdith;++j)
{
*pLine = B[Q];
pLine++;
*pLine = G[Q];
pLine++;
*pLine = R[Q];
pLine++;
Q++;
}
}

fp.WriteHuge(pData,bmiHdr.biSizeImage);//写入位数据
delete [] pData; //删除
fp.Close();



}
...全文
138 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
ww012 2004-07-06
  • 打赏
  • 举报
回复
谢谢,蒋老大和诸位,看样子是这个转RGB分量的函数的问题了!^_^
蒋晟 2004-07-06
  • 打赏
  • 举报
回复
24色位图的确是3字节对齐的。文件结构没什么毛病,看看是不是位图数据有问题
ww012 2004-07-06
  • 打赏
  • 举报
回复
352 * 3能被4整除,应该可以这么写的啊!
Wanix 2004-07-06
  • 打赏
  • 举报
回复
高手!学习学习!
快乐鹦鹉 2004-07-06
  • 打赏
  • 举报
回复
bmiHdr.biSizeImage = m_WidthOfModel* 3 * m_HeightOfModel;
这个好像不对
WORD WidthBytes = 352 * 3;这也不对。
=========
注意一点:位图文件每行是4字节对齐的。也就是说,每行的长度必须是4的倍数。所以你简单的乘以3都是不对的
ww012 2004-07-06
  • 打赏
  • 举报
回复
怎么没人回答,先自己顶一下^_^
ww012 2004-07-06
  • 打赏
  • 举报
回复
to hfxian(hfxian)
我按照你的方法试了一下,好像还是不行
happyabird 2004-07-06
  • 打赏
  • 举报
回复
24位图像是以R,G,B再加一位保留位组成的,共四位
===
楼上,不是吧?RGB正好24位,保留位在哪里啊?????
hfxian 2004-07-06
  • 打赏
  • 举报
回复
bmiHdr.biSizeImage = m_WidthOfModel* 4 * m_HeightOfModel;
下面的改成
for(int i = nHeight - 1;i >= 0;i--)
{
pLine = pData + i * WidthBytes;

for(int j = 0;j < nWdith;j++)
{
*pLine = B[Q];
pLine++;
*pLine = G[Q];
pLine++;
*pLine = R[Q];
pLine++;
*pLine = 0
pLine++;

Q++;
}
}
如果用--i则第一次pLine = pData + i * WidthBytes;i会等于nHeight - 2.同要--j也不对
24位图像是以R,G,B再加一位保留位组成的,共四位
转自看雪的CCDeath 【文章标题】: WinMount虚拟磁盘深入研究(-)之filedisk源代码详细分析 【下载地址】: 自己搜索下载 【作者声明】: 只是感兴趣,没有其他目的。失误之处敬诸位大侠赐教! -------------------------------------------------------------------------------- 【详细过程】 我的驱动入门三终结版,还再学习中。由于个人也有些事情要处理,研究起刘涛涛WinMount的虚拟 磁盘,而且这方面的书籍,貌似乎没见过,只有傻傻的几K代码存在,没注释什么的,整体框架也没说。 虚拟光驱用实现文件来模拟磁盘的原理,是文件系统驱动程序。 把filedisk驱动安装,查看install.txt文件。 1.Copy the driver (filedisk.sys) to %systemroot%\system32\drivers\. 2.Import filedisk.reg to the Registry. 3.Reboot. 4.Use the program filedisk.exe to mount/umount files, for an example of use see the file example.txt. 可以不用重起机子的方法,找一个动载加载驱动工具:DriverMonitor不错了。然后在“开始菜单”-> "运行"输入 "net start filedisk" 出现:“ 求的服务已经启动”。这个必须得成功才行哦。 接下来注意点。cmd后 出现这个目录 C:\Documents and Settings \Administrator>,在接下来敲入 filedisk /mount 0 c:\temp\filedisk.img 8M f: C:\Documents and Settings \Administrator>filedisk /mount 0 c:\temp\filedisk.img 8M r: 回车一下。 出现"FileDisk:系统找不到指定路径" 。原因就出在这 "c:\temp\filedisk.img" 中的C:\temp要这个目录才行。至于 filedisk.img不是必须,会自动创建。 如果有出现"FileDisk:函数不正确" 中的“filedisk /mount 0 ”中"0"代号已经被使用。可以改为"1". 查看一下,结果就出现一个还未格式化 8M R磁盘,查看C:\temp下生成一个filedisk.img也8M。想卸载 掉"filedisk /umount r:". 还可以创建很大的虚拟磁盘,你把"8M"改换其他的就是了。 以上如果都没出现结果,基本上就没兴趣继续研究下去了,我看到了很多人初学filedisk都遇到以上这 些问题(包括我在内) ,把我折腾了半天。 先来分析驱动层代码,后来分析应用层代码。更详细的看附件里的源代码。我对代码工程方式重新布 局,用起来更方便。 ===================================//先来分析驱动层代码 1.对filedisk.h进行分析 #define FILE_DEVICE_FILE_DISK 0x8000//用户定义范围0x8000~ #define IOCTL_FILE_DISK_OPEN_FILE CTL_CODE(FILE_DEVICE_FILE_DISK, 0x800, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) #define IOCTL_FILE_DISK_CLOSE_FILE CTL_CODE(FILE_DEVICE_FILE_DISK, 0x801, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) #define IOCTL_FILE_DISK_QUERY_FILE CTL_CODE(FILE_DEVICE_FILE_DISK, 0x802, METHOD_BUFFERED, FILE_READ_ACCESS) typedef struct _OPEN_FILE_INFORMATION { LARGE_INTEGER FileSize;//文件大小 BOOLEAN ReadOnly;//只读属性 USHORT Fil
MATLAB智能算法实现(⼀) MATLAB智能算法实现 (⼀) 写在前⾯:突然想做点⼉什么,为⾃⼰本科四年的学习⽣涯画上⼀个句点。⽤⼀款⾃⼰喜欢的软件实现⼀些⽼师们在上课时总提到的智能算 法应该是⼀件极有意义的事吧! 我的⽬的:没什么⽬的,万⼀将来⽤得上呢?! 我的希望: 1、有C语⾔基础和MATLAB基本矩阵计算实践的童鞋们可以⽆障碍阅读代码; 2、写这些东西的⼈不是⼤神,所以不希望⼤神前来吐槽。仅供包括我在内的菜鸟们交流讨论; 3、再次强调,⼤神们总是忘了⾃⼰矬的时候是什么样,所以希望诸位⼤触看看即可,笑笑也罢。 蚁群算法 所有的群智能算法的核⼼思想都在于:"个体的⾏为确定了群体的⾏动模式,个体⼜接收着来⾃群体的信息并依据此调整⾃⼰的⾏为"。那 么归于蚁群,这⼀算法的特征有三: 其⼀,蚂蚁个体在其⾏动路径上总是均匀地播撒信息素; 其⼆,信息素的浓度随着时间的变化⽽变化,同时信息素是蚂蚁个体间极为重要的协调单元; 其三,蚂蚁个体总沿着信息素浓度⾼的⽅向前进,但⼜有⼀些随机扰动使得其偏离原有的路线。 如上图所⽰,在a时刻,蚂蚁并不知道那条路距离⾷物更近,于是从巢⽳出发的蚂蚁沿着⾷物发出的"⾹味"找到上下两条道路。如果我们 假定: 1)每只蚂蚁⼀次出⾏(往返)所能释放的信息素总量是相同的; 2)蚂蚁们保持相等的时间间隔交替选择出⾏路线,即t时刻出动的蚂蚁选择上⾯的道路,t+1时刻出动的就选择下⾯的道路,t+2时刻⼜回 到上⾯的道路。 基于以上两条假定,我们可以得出:上⾯的路径由于距离较短,所以单位长度上的信息素量(浓度)要⾼于下⽅路径。所以⼀段时间过后信 息素的浓度差异已经⾜以引起⼤多数蚂蚁的关注,上⽅道路上的蚂蚁开始逐渐变多(b时刻)。 我们可以想到,b状态最终将发展成为c状态,信息素随时间变化浓度降低,有鲜有蚂蚁⾏⾄于此,所以下⽅道路的信息素逐渐消散。同时需 要关注的是,有些特⽴独⾏的蚂蚁并不以信息素浓度最为⾃⼰选择路线的唯⼀标准,它们会开辟⼀些新的道路,同时引起⼀些同伴的关注。 这种随机性也为系统的⾃由化提供了理论基础,这些"创新"的探索如果的确距离更短,那么这⼀路径将在信息素的调解下演化成为新的主 流,反正则会得到纠正。 以下是解放军⼯程信息⼤学的⼀位⽼师编写的MATLAB程序,它利⽤蚁群算法,实现了"担货郎"问题的求解(遍历所有的销售点,同时 使得总的⾏进路程最短)。以下是源代码和本⼈对程序的解释: function[R_best,L_best,L_ave,Shortest_Route,Shortest_Length] = ACATSP(C,NC_max,m,Alpha,Beta,Rho,Q) %% 主要符号说明 %% C:n个城市的坐标,n*2的矩阵 %% NC_max:最⼤迭代次数 %% m:蚂蚁个数 %% Alpha:表征信息素重要程度的参数 %% Beta:表征启发因⼦重要程度的参数 %% Rho:信息素蒸发系数 %% Q:信息素增加强度系数 %% R_best:各代最佳路线 %% L_best:各代最佳路线长度 %% Step1:变量初始化 n = size(C,1); % D为⼀个⽆向加权图,表中的每⼀⾏记录了某⼀个城市到另外n-1个城市的距离 D = zeros(n,n); for i = 1:1:n for j = 1:1:n if i ~= j D(i,j) = ((C(i,1) - C(j,1))^2 + (C(i,2) - C(j,2))^2)^0.5; else % eps是MATLAB所能识别的最⼩正浮点数,即认为"0+eps/2 = 0" D(i,j) = eps; end end end % Eta表⽰了距离倒数,作为路径选择重要的启发因⼦,蚂蚁去信息素多且离当前位置距离较近的城市 Eta = 1./D; % Tau表⽰城市间(n*n矩阵)的信息素含量,⼀开始是均匀的为⼀个"全⼀"矩阵 Tau = ones(n,n); % 每⼀只蚂蚁都要根据信息素和⾃⼰判断,独⽴求解"担货郎"问题,Tabu记录着m只蚂蚁在n个城市间⾏进的轨迹。第m⾏n列表⽰:第m只蚂蚁去的第n个城市为 Tabu = zeros(m,n); % NC是迭代次数 NC = 1; % 每⼀次迭代结束后的最段路径 R_best = zeros(NC_max,n); % 每⼀次迭代后的最短路径长度 L_best = inf.*ones(NC_max,1); % 每⼀次迭代后m只蚂蚁所得路径的平均值 L_ave = zeros(NC,1); while NC <= NC_max %% Step2:将m只蚂蚁放到n个城市上 RandPosition = []; % ceil函数是向上取整,randperm函数是⽣成随机数列,rand

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧