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都是不对的
这个好像不对
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再加一位保留位组成的,共四位
下面的改成
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位,保留位在哪里啊?????
===
楼上,不是吧?RGB正好24位,保留位在哪里啊?????
#9
to hfxian(hfxian)
我按照你的方法试了一下,好像还是不行
我按照你的方法试了一下,好像还是不行
#1
怎么没人回答,先自己顶一下^_^
#2
bmiHdr.biSizeImage = m_WidthOfModel* 3 * m_HeightOfModel;
这个好像不对
WORD WidthBytes = 352 * 3;这也不对。
=========
注意一点:位图文件每行是4字节对齐的。也就是说,每行的长度必须是4的倍数。所以你简单的乘以3都是不对的
这个好像不对
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再加一位保留位组成的,共四位
下面的改成
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位,保留位在哪里啊?????
===
楼上,不是吧?RGB正好24位,保留位在哪里啊?????
#9
to hfxian(hfxian)
我按照你的方法试了一下,好像还是不行
我按照你的方法试了一下,好像还是不行