C++保存HBITMAP为位图文件的实现方法
本文使用C++将位图句柄HBITMAP保存为位图文件,配合C++抓图代码可以实现抓图保存文件(.bmp)。
其步骤如下:
1、创建位图文件;
2、计算位图中每个像素所占字节数;
3.获取位图结构BITMAP;
4、构造位图信息头BITMAPINFOHEADER;
5、构造位图文件头BITMAPFILEHEADER;
6、为位图内容分配内存;
7、处理调色板;
8、写入文件;
9、清除资源。
下面是C++源代码:
ImageHelper.h
#pragmaonce #include#include usingnamespacestd; classImageHelper { public: staticboolSaveBitmapToFile(HBITMAPbitmap,conststring&filename);//保存位图到文件 private: staticWORDGetBitmapBitCount();//计算位图文件每个像素所占字节数 staticvoidProcessPalette(HBITMAPhBitmap,constBITMAP&bitmap, DWORDpaletteSize,LPBITMAPINFOHEADERlpBmpInfoHeader);//处理调色板 };
ImageHelper.cpp
#include"ImageHelper.h" #includeboolImageHelper::SaveBitmapToFile(HBITMAPhBitmap,conststring&filename) { //1.创建位图文件 constautofile=CreateFileA(filename.c_str(),GENERIC_WRITE, 0,nullptr,CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL|FILE_FLAG_SEQUENTIAL_SCAN, nullptr); if(file==INVALID_HANDLE_VALUE) { returnfalse; } //2.计算位图文件每个像素所占字节数 constautobitCount=GetBitmapBitCount(); //3.获取位图结构 BITMAPbitmap; ::GetObject(hBitmap,sizeof(bitmap),reinterpret_cast (&bitmap)); //位图中像素字节大小(32字节对齐) constDWORDbmBitsSize=((bitmap.bmWidth*bitCount+31)/32)*4*bitmap.bmHeight; //调色板大小 constDWORDpaletteSize=0; //4.构造位图信息头 BITMAPINFOHEADER bmpInfoHeader;//位图信息头结构 bmpInfoHeader.biSize=sizeof(BITMAPINFOHEADER); bmpInfoHeader.biWidth=bitmap.bmWidth; bmpInfoHeader.biHeight=bitmap.bmHeight; bmpInfoHeader.biPlanes=1; bmpInfoHeader.biBitCount=bitCount; bmpInfoHeader.biCompression=BI_RGB; bmpInfoHeader.biSizeImage=0; bmpInfoHeader.biXPelsPerMeter=0; bmpInfoHeader.biYPelsPerMeter=0; bmpInfoHeader.biClrImportant=0; bmpInfoHeader.biClrUsed=0; //5.构造位图文件头 BITMAPFILEHEADERbmpFileHeader; bmpFileHeader.bfType=0x4D42;//"BM" //位图文件大小 constDWORDdibSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+paletteSize+bmBitsSize; bmpFileHeader.bfSize=dibSize; bmpFileHeader.bfReserved1=0; bmpFileHeader.bfReserved2=0; bmpFileHeader.bfOffBits=static_cast (sizeof(BITMAPFILEHEADER)) +static_cast (sizeof(BITMAPINFOHEADER))+paletteSize; //6.为位图内容分配内存 constautodib=GlobalAlloc(GHND,bmBitsSize+paletteSize+sizeof(BITMAPINFOHEADER));//内存句柄 constautolpBmpInfoHeader=static_cast (GlobalLock(dib));//指向位图信息头结构 *lpBmpInfoHeader=bmpInfoHeader; //7.处理调色板 ProcessPalette(hBitmap,bitmap,paletteSize,lpBmpInfoHeader); //8.写入文件 DWORDwritten=0;//写入文件字节数 WriteFile(file,reinterpret_cast (&bmpFileHeader),sizeof(BITMAPFILEHEADER), &written,nullptr);//写入位图文件头 WriteFile(file,reinterpret_cast (lpBmpInfoHeader),dibSize, &written,nullptr);//写入位图文件其余内容 //9.清理资源 GlobalUnlock(dib); GlobalFree(dib); CloseHandle(file); returntrue; } //计算位图文件每个像素所占字节数 WORDImageHelper::GetBitmapBitCount() { constautodc=::CreateDCA("DISPLAY",nullptr,nullptr,nullptr); //当前分辨率下每像素所占字节数 constautobits=::GetDeviceCaps(dc,BITSPIXEL)*GetDeviceCaps(dc,PLANES); ::DeleteDC(dc); //位图中每像素所占字节数 WORDbitCount; if(bits<=1) bitCount=1; elseif(bits<=4) bitCount=4; elseif(bits<=8) bitCount=8; else bitCount=24; returnbitCount; } //处理调色板 voidImageHelper::ProcessPalette(HBITMAPhBitmap,constBITMAP&bitmap, DWORDpaletteSize,LPBITMAPINFOHEADERlpBmpInfoHeader) { HANDLEoldPalette=nullptr; HDCdc=nullptr; constautopalette=GetStockObject(DEFAULT_PALETTE); if(palette!=nullptr) { dc=::GetDC(nullptr); oldPalette=::SelectPalette(dc,static_cast (palette),FALSE); ::RealizePalette(dc);//实现设备调色板 } //获取该调色板下新的像素值 GetDIBits(dc,hBitmap,0,static_cast (bitmap.bmHeight), reinterpret_cast (lpBmpInfoHeader)+sizeof(BITMAPINFOHEADER)+paletteSize, reinterpret_cast (lpBmpInfoHeader),DIB_RGB_COLORS); //恢复调色板 if(oldPalette!=nullptr) { ::SelectPalette(dc,static_cast (oldPalette),TRUE); ::RealizePalette(dc); ::ReleaseDC(nullptr,dc); } }
以上就是C++保存HBITMAP为位图文件的实现方法的详细内容,更多关于C++保存HBITMAP的资料请关注毛票票其它相关文章!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。