读取BMP

近日遇上了一些带alpha通道的bmp文件,于是想如果loadpicture能够正确读取的话,那么使用起AlphaBlend函数就舒服很多了,不需要使用GDI+来读取PNG文件了.

一试之下,发现loadpicture确实能正确读取, 但又因为AlphaBlend似乎有bug(参看AlphaBlend有BUG?),于是唯有自己写代码来进行alpha混合处理了.这里为了偷懒,自然是希望读出来的图片是32bit的,但是loadpicture竟然是根据桌面的显示色深来加载图片的,如果系统是16bit的,它加载得到的图片也是16bit,这样子就比较麻烦了.

于是寻求其他方案,想,api中应该有函数能直接读取bmp的吧.找啊找,终于找到一个CreateDIBSection,原型为,

HBITMAP CreateDIBSection( 
    HDC
hdc , // handle to DC
    CONST BITMAPINFO * pbmi , // bitmap data
    UINT iUsage , // data type indicator
    VOID ** ppvBits , // bit values
    HANDLE hSection , // handle to file mapping object
    DWORD dwOffset // offset to bitmap bit values
);

BITMAPINFO可以从bmp文件中获得,位于文件开头,跟在BITMAPFILEHEADER后面,而BITMAPFILEHEADER位于文件开始的地方,vb代码可以这样写

 

Dim  tbfh  As  BITMAPFILEHEADER
Dim  tbh  As  BITMAPINFOHEADER
Dim  tbhi  As  BITMAPINFO

Open sFile 
For  Binary  As   1
    
Get   1 , , tbfh
    
Get   1 , , tbh
Close 
1

tbhi.bmiHeader 
=  tbh
tHbmp 
=  CreateDIBSection(CreateCompatibleDC( 0 ), tbhi,  0 & , VarPtr(tPtr), 0, 0 )

这样就会在内存中创建一个与文件等大小的图像,然后可以直接用文件接下来的数据填充到tPtr对应的内存中即可.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值