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