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

时间:2022-08-03 17:11:21
为什么我得到图像是空的啊?!郁闷啊?!
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();



}

9 个解决方案

#1


怎么没人回答,先自己顶一下^_^

#2


bmiHdr.biSizeImage = m_WidthOfModel* 3 * m_HeightOfModel;
这个好像不对
WORD WidthBytes = 352 * 3;这也不对。
=========
注意一点:位图文件每行是4字节对齐的。也就是说,每行的长度必须是4的倍数。所以你简单的乘以3都是不对的

#3


高手!学习学习!

#4


352 * 3能被4整除,应该可以这么写的啊!

#5


24色位图的确是3字节对齐的。文件结构没什么毛病,看看是不是位图数据有问题

#6


谢谢,蒋老大和诸位,看样子是这个转RGB分量的函数的问题了!^_^

#7


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再加一位保留位组成的,共四位

#8


24位图像是以R,G,B再加一位保留位组成的,共四位
===
楼上,不是吧?RGB正好24位,保留位在哪里啊?????

#9


to hfxian(hfxian)
     我按照你的方法试了一下,好像还是不行

#1


怎么没人回答,先自己顶一下^_^

#2


bmiHdr.biSizeImage = m_WidthOfModel* 3 * m_HeightOfModel;
这个好像不对
WORD WidthBytes = 352 * 3;这也不对。
=========
注意一点:位图文件每行是4字节对齐的。也就是说,每行的长度必须是4的倍数。所以你简单的乘以3都是不对的

#3


高手!学习学习!

#4


352 * 3能被4整除,应该可以这么写的啊!

#5


24色位图的确是3字节对齐的。文件结构没什么毛病,看看是不是位图数据有问题

#6


谢谢,蒋老大和诸位,看样子是这个转RGB分量的函数的问题了!^_^

#7


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再加一位保留位组成的,共四位

#8


24位图像是以R,G,B再加一位保留位组成的,共四位
===
楼上,不是吧?RGB正好24位,保留位在哪里啊?????

#9


to hfxian(hfxian)
     我按照你的方法试了一下,好像还是不行