读取BMP

来源:互联网 发布:2017一建挂靠前景知乎 编辑:程序博客网 时间:2024/04/29 21:33

近日遇上了一些带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对应的内存中即可.