怎么将图像数据保存为BMP文件格式? 我已经有图像数据了,是裸数据,我想借用HBITMAP类将该数据保存为BMP文件,该怎么做啊?大家帮帮我! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 要根据BMP文件存储的格式进行处理。需要一个BMP文件头信息,然后才是位图数据。 http://www.paintlib.de/paintlib/你可以参考一下这个类 这是别人的程序,你看看,或许对你有帮助///////////将内存中的BMP文件内容转换到HBITMAP///////HBITMAP bitmap;LPSTR hDIB,lpBuffer;LPVOID lpDIBBits;BITMAPFILEHEADER bmfHeader;DWORD bmfHeaderLen;bmfHeaderLen = sizeof(bmfHeader);strncpy((LPSTR)&bmfHeader,(LPSTR)lpBuffer,bmfHeaderLen);if (bmfHeader.bfType != ((WORD) ('M' << 8) | 'B')) return;hDIB = lpBuffer + bmfHeaderLen;BITMAPINFOHEADER &bmiHeader = *(LPBITMAPINFOHEADER)hDIB ;BITMAPINFO &bmInfo = *(LPBITMAPINFO)hDIB ;int nColors = bmiHeader.biClrUsed ? bmiHeader.biClrUsed : 1 << bmiHeader.biBitCount; if( bmInfo.bmiHeader.biBitCount > 8 ) lpDIBBits = (LPVOID)((LPDWORD)(bmInfo.bmiColors + bmInfo.bmiHeader.biClrUsed) + ((bmInfo.bmiHeader.biCompression == BI_BITFIELDS) ? 3 : 0));else lpDIBBits = (LPVOID)(bmInfo.bmiColors + nColors);bitmap = CreateDIBitmap(dc.m_hDC,&bmiHeader,CBM_INIT,lpDIBBits,&bmInfo,DIB_RGB_COLORS);lpBuffer是内存中BMP的数据 已知一个bmp图片的HBITMAP把它存为.bmp文件//try this code//lpfilename 为位图文件名,hbitmap 为刚才的屏幕位图句柄int SaveBitmapToFile(HBITMAP hbitmap , LPSTR lpfilename){ HDC hdc; //设备描述表int ibits; WORD wbitcount; //当前显示分辨率下每个像素所占字节数//位图中每个像素所占字节数,定义调色板大小,位图中像素字节大小,位图文件大小 ,写入文件字节数DWORD dwpalettesize=0, dwbmbitssize, dwdibsize, dwwritten;BITMAP bitmap; //位图属性结构BITMAPFILEHEADER bmfhdr; //位图文件头结构BITMAPINFOHEADER bi; //位图信息头结构LPBITMAPINFOHEADER lpbi; //指向位图信息头结构//定义文件,分配内存句柄,调色板句柄HANDLE fh, hdib, hpal,holdpal=NULL;//计算位图文件每个像素所占字节数hdc = CreateDC("display",NULL,NULL,NULL);ibits = GetDeviceCaps(hdc, BITSPIXEL) * GetDeviceCaps(hdc, PLANES);DeleteDC(hdc);if (ibits <= 1)wbitcount = 1;else if (ibits <= 4)wbitcount = 4;else if (ibits <= 8)wbitcount = 8;else if (ibits <= 16)wbitcount = 16;else if (ibits <= 24)wbitcount = 24;else wbitcount = 32;//计算调色板大小if (wbitcount <= 8)dwpalettesize = (1 << wbitcount) * sizeof(RGBQUAD);//设置位图信息头结构GetObject(hbitmap, sizeof(BITMAP), (LPSTR)&bitmap);bi.biSize = sizeof(BITMAPINFOHEADER);bi.biWidth = bitmap.bmWidth;bi.biHeight = bitmap.bmHeight;bi.biPlanes = 1;bi.biBitCount = wbitcount;bi.biCompression = BI_RGB;bi.biSizeImage = 0;bi.biXPelsPerMeter = 0;bi.biYPelsPerMeter = 0;bi.biClrUsed = 0;bi.biClrImportant = 0;dwbmbitssize = ((bitmap.bmWidth * wbitcount+31)/32)* 4 * bitmap.bmHeight ;//为位图内容分配内存hdib = GlobalAlloc(GHND,dwbmbitssize + dwpalettesize + sizeof(BITMAPINFOHEADER));lpbi = (LPBITMAPINFOHEADER)GlobalLock(hdib);*lpbi = bi;// 处理调色板 hpal = GetStockObject(DEFAULT_PALETTE);if (hpal){hdc = ::GetDC(NULL);holdpal = SelectPalette(hdc, (HPALETTE)hpal, false);RealizePalette(hdc);}// 获取该调色板下新的像素值GetDIBits(hdc, hbitmap, 0, (UINT) bitmap.bmHeight,(LPSTR)lpbi + sizeof(BITMAPINFOHEADER)+dwpalettesize,(BITMAPINFO*)lpbi, DIB_RGB_COLORS);//恢复调色板 if (holdpal){SelectPalette(hdc, (HPALETTE)holdpal, true);RealizePalette(hdc);::ReleaseDC(NULL, hdc);}//创建位图文件 fh = CreateFile(lpfilename, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL|FILE_FLAG_SEQUENTIAL_SCAN, NULL);if (fh == INVALID_HANDLE_VALUE)return false;// 设置位图文件头bmfhdr.bfType = 0x4d42; // "bm"dwdibsize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)+ dwpalettesize + dwbmbitssize; bmfhdr.bfSize = dwdibsize;bmfhdr.bfReserved1 = 0;bmfhdr.bfReserved2 = 0;bmfhdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER)+ dwpalettesize;// 写入位图文件头WriteFile(fh, (LPSTR)&bmfhdr, sizeof(BITMAPFILEHEADER), &dwwritten, NULL);// 写入位图文件其余内容WriteFile(fh, (LPSTR)lpbi, dwdibsize, &dwwritten, NULL);//清除 GlobalUnlock(hdib);GlobalFree(hdib);CloseHandle(fh);return true;} 怎样获取窗口的句柄 windows控制台程序,h文件和cpp文件不在同一个目录,找不到cpp,如何解决??? 怎样在CMainFrame中添加滚动条呢? onsize是什么消息 MSN登录问题(https协议) 请教GDI+实现图形的缩放,显示程序5(100分)!assert1,我说话算数! 求助:listctrl怎么隐藏某一个列 加急 求助Duilib 库问题 打扰大家了:请问怎样改变其他正在运行程序的窗口大小。谢谢 vc关于如何隐藏窗口 求BMP-JPG的免费OCX或者DLL, 学习使用ATL开发COM和使用C++或者MFC开发COM到底有什么区别?
需要一个BMP文件头信息,然后才是
位图数据。
你可以参考一下这个类
///////////将内存中的BMP文件内容转换到HBITMAP///////
HBITMAP bitmap;
LPSTR hDIB,lpBuffer;
LPVOID lpDIBBits;
BITMAPFILEHEADER bmfHeader;
DWORD bmfHeaderLen;bmfHeaderLen = sizeof(bmfHeader);
strncpy((LPSTR)&bmfHeader,(LPSTR)lpBuffer,bmfHeaderLen);
if (bmfHeader.bfType != ((WORD) ('M' << 8) | 'B'))
return;
hDIB = lpBuffer + bmfHeaderLen;
BITMAPINFOHEADER &bmiHeader = *(LPBITMAPINFOHEADER)hDIB ;
BITMAPINFO &bmInfo = *(LPBITMAPINFO)hDIB ;
int nColors = bmiHeader.biClrUsed ? bmiHeader.biClrUsed : 1 << bmiHeader.biBitCount;
if( bmInfo.bmiHeader.biBitCount > 8 )
lpDIBBits = (LPVOID)((LPDWORD)(bmInfo.bmiColors + bmInfo.bmiHeader.biClrUsed) +
((bmInfo.bmiHeader.biCompression == BI_BITFIELDS) ? 3 : 0));
else
lpDIBBits = (LPVOID)(bmInfo.bmiColors + nColors);bitmap = CreateDIBitmap(dc.m_hDC,&bmiHeader,CBM_INIT,lpDIBBits,&bmInfo,DIB_RGB_COLORS);
lpBuffer是内存中BMP的数据
//try this code
//lpfilename 为位图文件名,hbitmap 为刚才的屏幕位图句柄
int SaveBitmapToFile(HBITMAP hbitmap , LPSTR lpfilename)
{
HDC hdc; //设备描述表
int ibits;
WORD wbitcount; //当前显示分辨率下每个像素所占字节数//位图中每个像素所占字节数,定义调色板大小,位图中像素字节大小,位图文件大小 ,写入文件字节数
DWORD dwpalettesize=0, dwbmbitssize, dwdibsize, dwwritten;BITMAP bitmap; //位图属性结构
BITMAPFILEHEADER bmfhdr; //位图文件头结构
BITMAPINFOHEADER bi; //位图信息头结构
LPBITMAPINFOHEADER lpbi; //指向位图信息头结构//定义文件,分配内存句柄,调色板句柄
HANDLE fh, hdib, hpal,holdpal=NULL;//计算位图文件每个像素所占字节数
hdc = CreateDC("display",NULL,NULL,NULL);
ibits = GetDeviceCaps(hdc, BITSPIXEL) * GetDeviceCaps(hdc, PLANES);
DeleteDC(hdc);if (ibits <= 1)
wbitcount = 1;
else if (ibits <= 4)
wbitcount = 4;
else if (ibits <= 8)
wbitcount = 8;
else if (ibits <= 16)
wbitcount = 16;
else if (ibits <= 24)
wbitcount = 24;
else
wbitcount = 32;//计算调色板大小
if (wbitcount <= 8)
dwpalettesize = (1 << wbitcount) * sizeof(RGBQUAD);//设置位图信息头结构
GetObject(hbitmap, sizeof(BITMAP), (LPSTR)&bitmap);
bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = bitmap.bmWidth;
bi.biHeight = bitmap.bmHeight;
bi.biPlanes = 1;
bi.biBitCount = wbitcount;
bi.biCompression = BI_RGB;
bi.biSizeImage = 0;
bi.biXPelsPerMeter = 0;
bi.biYPelsPerMeter = 0;
bi.biClrUsed = 0;
bi.biClrImportant = 0;dwbmbitssize = ((bitmap.bmWidth * wbitcount+31)/32)* 4 * bitmap.bmHeight ;
//为位图内容分配内存
hdib = GlobalAlloc(GHND,dwbmbitssize + dwpalettesize +
sizeof(BITMAPINFOHEADER));
lpbi = (LPBITMAPINFOHEADER)GlobalLock(hdib);
*lpbi = bi;// 处理调色板
hpal = GetStockObject(DEFAULT_PALETTE);
if (hpal)
{
hdc = ::GetDC(NULL);
holdpal = SelectPalette(hdc, (HPALETTE)hpal, false);
RealizePalette(hdc);
}// 获取该调色板下新的像素值
GetDIBits(hdc, hbitmap, 0, (UINT) bitmap.bmHeight,(LPSTR)lpbi +
sizeof(BITMAPINFOHEADER)+dwpalettesize,(BITMAPINFO*)lpbi, DIB_RGB_COLORS);//恢复调色板
if (holdpal)
{
SelectPalette(hdc, (HPALETTE)holdpal, true);
RealizePalette(hdc);
::ReleaseDC(NULL, hdc);
}//创建位图文件
fh = CreateFile(lpfilename, GENERIC_WRITE, 0, NULL,
CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL|
FILE_FLAG_SEQUENTIAL_SCAN, NULL);
if (fh == INVALID_HANDLE_VALUE)
return false;// 设置位图文件头
bmfhdr.bfType = 0x4d42; // "bm"
dwdibsize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)+
dwpalettesize + dwbmbitssize;
bmfhdr.bfSize = dwdibsize;
bmfhdr.bfReserved1 = 0;
bmfhdr.bfReserved2 = 0;
bmfhdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) +
(DWORD)sizeof(BITMAPINFOHEADER)+ dwpalettesize;// 写入位图文件头
WriteFile(fh, (LPSTR)&bmfhdr, sizeof(BITMAPFILEHEADER), &dwwritten, NULL);// 写入位图文件其余内容
WriteFile(fh, (LPSTR)lpbi, dwdibsize, &dwwritten, NULL);
//清除
GlobalUnlock(hdib);
GlobalFree(hdib);
CloseHandle(fh);
return true;
}