(转)如何将HBITMAP类型转化为CMemFile对象?

来源:互联网 发布:足球鞋钉分类知乎 编辑:程序博客网 时间:2024/06/03 23:50

HANDLE CBmp2Avi::Bitmap2Dib( HBITMAP hbitmap, UINT bits )
{
HANDLE hdib ;
HDC hdc ;
BITMAP bitmap ;
UINT wLineLen ;
DWORD dwSize ;
DWORD wColSize ;
LPBITMAPINFOHEADER lpbi ;
LPBYTE lpBits ;

GetObject(hbitmap,sizeof(BITMAP),&bitmap) ;

wLineLen = (bitmap.bmWidth*bits+31)/32 * 4;
wColSize = sizeof(RGBQUAD)*((bits <= 8) ? 1<<bits : 0);
dwSize = sizeof(BITMAPINFOHEADER) + wColSize +
(DWORD)(UINT)wLineLen*(DWORD)(UINT)bitmap.bmHeight;

hdib = GlobalAlloc(GHND,dwSize);
if (!hdib)
return hdib ;

lpbi = (LPBITMAPINFOHEADER)GlobalLock(hdib) ;

lpbi->biSize = sizeof(BITMAPINFOHEADER) ;
lpbi->biWidth = bitmap.bmWidth ;
lpbi->biHeight = bitmap.bmHeight ;
lpbi->biPlanes = 1 ;
lpbi->biBitCount = (WORD) bits ;
lpbi->biCompression = BI_RGB ;
lpbi->biSizeImage = dwSize - sizeof(BITMAPINFOHEADER) - wColSize ;
lpbi->biXPelsPerMeter = 0 ;
lpbi->biYPelsPerMeter = 0 ;
lpbi->biClrUsed = (bits <= 8) ? 1<<bits : 0;
lpbi->biClrImportant = 0 ;

lpBits = (LPBYTE)(lpbi+1)+wColSize ;

hdc = CreateCompatibleDC(NULL) ;

GetDIBits(hdc,hbitmap,0,bitmap.bmHeight,lpBits,(LPBITMAPINFO)lpbi, DIB_RGB_COLORS);

lpbi->biClrUsed = (bits <= 8) ? 1<<bits : 0;

DeleteDC(hdc) ;
GlobalUnlock(hdib);

return hdib ;
}


CMemFile* memF= (CMemFile*)GlobalLock(Bitmap2Dib(hbm, 8));
    fanxuehai 于 2005-5-11 21:02:38
多谢howtotell(从何谈起)的指点,我用你提供的源码试了一下,编译是通过了的,但一执行就出现“死机”(程序死了)的现象,不知是我在哪里出现偏差?
    fanxuehai 于 2005-5-13 16:57:15
谁能帮我解决这个问题啊?急啊。。。
    dongfa(一桶江湖) 于 2005-5-13 17:07:48
要new CMemFile

CMemFile* memF = new CMemFile(GlobalLock(Bitmap2Dib(hbm, 8)));
    bobob(静思--潜心研究PDF) 于 2005-5-13 17:13:49

指定memfile的size
就是上面函数中的dwSize
    fanxuehai 于 2005-5-13 18:28:11
还是没能有问题啊!
    fanxuehai 于 2005-5-13 19:46:46
有一点我就不明白:GlobalLock返回值类型为void,将它强制转化为CMemFile型,这样这个能将位图内容存进内存文件(CMemFile对象)吗?
    fanxuehai 于 2005-5-13 20:04:02
我刚才测试了一下,用CMemFile* memF= new CMemFile((int)GlobalLock(Bitmap2Dib(hBitmap, 8)))得到的memF文件的长度为0,内存文件为空,这是什么原因呢?敬请指教!
    dongfa(一桶江湖) 于 2005-5-13 20:09:26
HANDLE hData = Bitmap2Dib(hBitmap, 8);
UINT nSize = GlobalSize(hData);

CMemFile* memF= new CMemFile((BYTE *)GlobalLock(hData), nSize);
    fanxuehai 于 2005-5-15 17:59:28
谢谢大家!:)  http://www.bokebb.com/dev/cn/vc/arithmetic/20055245010_3999005.shtml