我想在32位Bitmap(或Bitmap32)上显示32位图像(带alpha通道的PNG)。
我不知道如何告诉函数混合图像而不是bliting它。就像使用AlphaBlend而不是BitBlt一样,我需要使这个功能混合图像而不是简单的blit。
这是我的例子:
ABitmap是TBitmap32(GR32)的类型,但结果与使用32位调色板的常规TBitmap相同。
ABitmap.SetSize(GetWidth, GetHeight);
SetStretchBltMode(ABitmap.Handle, COLORONCOLOR);//HALFTONE);
ABitmap.Clear($FFFFFFFF); { Here I try to erase background with white color, so that new image is blit over white surface }
StretchDIBits(
ABitmap.Handle,
0, 0,
GetWidth, GetHeight,
0, 0,
GetWidth, GetHeight,
FreeImage_GetBits(Dib),
FreeImage_GetInfo(Dib)^,
DIB_RGB_COLORS,
SRCCOPY); // --- SRCAND etc. produce not good results
FreeImage_GetBits和FreeImage_GetInfo是FreeImage库函数,它们指向位数组的开头并指向结构。
我做什么StretchDBit不允许混合。
答案 0 :(得分:2)
StretchDIBits()
没有任何alpha混合的概念。您必须首先将PNG blit到临时的32位位图,确保根据需要设置其Alpha通道,然后将AlphaBlend()
临时位图放到目标位图上。或者,如果PNG已经使用32位位图布局在内存中,您可以直接AlphaBlend()
PNG到目标位图。