已知 RGB24 数据、长、宽,如何保存为BMP文件,请具体的讲,最好有代码
已知 RGB24 数据、长、宽,如何保存为BMP文件,请具体的讲,最好有代码 问题点数:100、回复次数:5Top
1 楼vcleaner(我没当大哥很久了.......)回复于 2004-12-03 17:02:32 得分 45
参考:
void CCreateRandomBMPDlg::OnBtnCreateBMP()
{
CDC dc;
dc.CreateDC("DISPLAY", NULL, NULL, NULL);
CBitmap bm;
int Width = 800;//GetSystemMetrics(SM_CXSCREEN);
int Height = 600;//GetSystemMetrics(SM_CYSCREEN);
bm.CreateCompatibleBitmap(&dc, Width, Height);
CDC tdc;
tdc.CreateCompatibleDC(&dc);
CBitmap* pOld = tdc.SelectObject(&bm);
tdc.BitBlt(0, 0, Width, Height, &dc, 0, 0, SRCCOPY);
tdc.SelectObject(pOld);
BITMAP btm;
bm.GetBitmap(&btm);
DWORD size = btm.bmWidthBytes* btm.bmHeight;
LPSTR lpData = (LPSTR) GlobalAllocPtr(GPTR, size);
/////////////////////////////////////////////
/////////////////////////////////////////////
BITMAPINFOHEADER bih;
bih.biBitCount = btm.bmBitsPixel;
bih.biClrImportant = 0;
bih.biClrUsed = 0;
bih.biCompression = 0;
bih.biHeight = btm.bmHeight;
bih.biPlanes = 1;
bih.biSize = sizeof(BITMAPINFOHEADER);
bih.biSizeImage = size;
bih.biWidth = btm.bmWidth;
bih.biXPelsPerMeter = 0;
bih.biYPelsPerMeter = 0;
///////////////////////////////////
GetDIBits(dc, bm, 0, bih.biHeight, lpData, (BITMAPINFO *) &bih,
DIB_RGB_COLORS);
// bm.GetBitmapBits(size,lpData); //此函数在处理5-5-5模式的16位色下会出现颜色混乱
//////////////////////////////
//修改RGB值
int nWidth = btm.bmWidth * 4;
for (int i = 0; i < btm.bmHeight; i++)
{
for (int j = 0; j < btm.bmWidth; j++)
{
lpData[i * nWidth + j * 4 + 2] = GetRandomRGBValue(); //R
lpData[i * nWidth + j * 4 + 1] = GetRandomRGBValue(); //G
lpData[i * nWidth + j * 4] = GetRandomRGBValue(); //B
TRACE("\nR = %d; G = %d; B = %d\n",
lpData[i * nWidth + j * 4 + 2],
lpData[i * nWidth + j * 4 + 1], lpData[i * nWidth + j * 4]);
}
}
static int filecount = 0;
CString name;
name = "D:\\Test.bmp";//m_Path+name;
BITMAPFILEHEADER bfh;
bfh.bfReserved1 = bfh.bfReserved2 = 0;
bfh.bfType = ((WORD) ('M' << 8) | 'B');
bfh.bfSize = 54 + size;
bfh.bfOffBits = 54;
CFile bf;
if (bf.Open(name, CFile::modeCreate | CFile::modeWrite))
{
bf.WriteHuge(&bfh, sizeof(BITMAPFILEHEADER));
bf.WriteHuge(&bih, sizeof(BITMAPINFOHEADER));
bf.WriteHuge(lpData, size);
bf.Close();
}
GlobalFreePtr(lpData);
AfxMessageBox("Create BMP File Over!");
}Top
2 楼vcleaner(我没当大哥很久了.......)回复于 2004-12-03 17:03:38 得分 10
我是创建一个随机象素的BMP,RGB值是使用GetRandomRGBValue获得的一个随机数的!Top
3 楼aa3000(杀手K)回复于 2004-12-03 17:10:15 得分 0
关键是我不知道 RGB 数据格式和 BMP 文件格式是什么关系.请教Top
4 楼DentistryDoctor(不在无聊中无奈,就在沉默中变态)回复于 2004-12-03 17:10:51 得分 45
CFile fileBmp;
if(fileBmp.Open("Hello.bmp",CFile::modeWrite |CFile::shareExclusive | CFile::modeCreate))
{
BITMAPINFOHEADER fmtFrame = {sizeof(BITMAPINFOHEADER), 0, 0, 1, 24, BI_RGB, 0, 0, 0, 0, 0};
fmtFrame.biWidth = w;
fmtFrame.biHeight = h;
fmtFrame.biSizeImage =(w+3)/4*4*h*3;
BITMAPFILEHEADER fInfo;
ZeroMemory(&fInfo, sizeof fInfo);
fInfo.bfType = 0x4D42;
fInfo.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
fInfo.bfSize = fInfo.bfOffBits + fmtFrame.biSizeImage;
fileBmp.Write(&fInfo, sizeof fInfo);
fileBmp.Write(&fmtFrame,sizeof(fmtFrame));
fileBmp.Write(pBits,fmtFrame.biSizeImage);
}
fileBmp.Close();Top
5 楼DentistryDoctor(不在无聊中无奈,就在沉默中变态)回复于 2004-12-03 18:10:22 得分 0
如果是RGB24/RGB16话,前面是一个文件头,后面就是位数据。Top




