求已知R,G,B分量,宽,高转换成BMP文件的源码!谢谢

ww012 2004-06-17 04:17:23
下面是我写的有问题,请高手帮帮忙,能不能写全它!
谢谢^_^

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*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) + sizeof(RGBQUAD)*256 + m_WidthOfModel*m_HeightOfModel);
bmfHdr.bfReserved1 = 0;
bmfHdr.bfReserved2 = 0;
bmfHdr.bfOffBits=(DWORD)(sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256);

//保存文件
CFile fp;
fp.Open("f:\\Model.bmp",CFile::modeCreate | CFile::modeWrite);
fp.Write((LPSTR)&bmfHdr,sizeof(BITMAPFILEHEADER)); //写文件头
fp.Write((LPSTR)&bmiHdr,sizeof(BITMAPINFOHEADER)); //写信息头
...全文
127 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ww012 2004-06-19
  • 打赏
  • 举报
回复
CPictureDlg::yv12torgb(char *pchYuvBuff, char *pchR, char *pchG, char *pchB, int nWidth, int nHeight)
我这个函数已经得到RGB分量了,怎么用上面哪个函数,谢谢了!^_^
lambochan 2004-06-19
  • 打赏
  • 举报
回复
最后当然还要:
fp.WriteHuge(imageData,bmiHdr.biSizeImage);//写入位数据
lambochan 2004-06-19
  • 打赏
  • 举报
回复
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;//因为352 * 3能被4整除,所以可以这样写
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) + /*sizeof(RGBQUAD)*256 +*/ m_WidthOfModel* 3 * m_HeightOfModel);//24Bit没色彩表
bmfHdr.bfReserved1 = 0;
bmfHdr.bfReserved2 = 0;
bmfHdr.bfOffBits=(DWORD)(sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)/*+sizeof(RGBQUAD)*256)*/;

//保存文件
CFile fp;
fp.Open("f:\\Model.bmp",CFile::modeCreate | CFile::modeWrite);
fp.Write((LPSTR)&bmfHdr,sizeof(BITMAPFILEHEADER)); //写文件头
fp.Write((LPSTR)&bmiHdr,sizeof(BITMAPINFOHEADER)); //写信息头
ww012 2004-06-19
  • 打赏
  • 举报
回复
怎么没有人回答啊?!
lambochan 2004-06-19
  • 打赏
  • 举报
回复
哦...3个RGB分量分别放在3个数组吗?数组存放格式是由上至下(扫描线)?
如果是,试来一段:
============================================================
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)//由下至上只需修改为for(int i=0;i<nHeight,++i)
{
pLine = pData + i * WidthBytes;
for(int j = 0;j < nWidth;++j)
{
*pLine = pchB[Q];
pLine++;
*pLine = pchG[Q];
pline++;
*pLine = pchR[Q];
pLine++;
Q++;
}
}
===============================================================
那么,char *pData就已经把3个分量数组转换成位图数据,就可以:
fp.WriteHuge(pData,bmiHdr.biSizeImage);//写入位数据
delete [] pData; //删除
ww012 2004-06-19
  • 打赏
  • 举报
回复
void CPictureDlg::yv12torgb(char *pchYuvBuff, char *pchR, char *pchG, char *pchB, int nWidth, int nHeight)
{
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;
}

}
lambochan 2004-06-19
  • 打赏
  • 举报
回复
帖这个函数上来看看..
ww012 2004-06-19
  • 打赏
  • 举报
回复
怎么把RBG分量写进上面那个函数啊?!
哪位大哥能帮帮忙啊!

19,468

社区成员

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

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