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


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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值