近日遇上了一些带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对应的内存中即可.
本文探讨了使用LoadPicture处理带Alpha通道的BMP文件时遇到的问题,并提供了通过API函数CreateDIBSection直接读取BMP文件的方法。文章还介绍了如何在内存中创建与文件等大小的图像,并使用文件数据填充内存。
360

被折叠的 条评论
为什么被折叠?



