StretchDIBits问题

时间:2012-05-10 22:48:30

标签: delphi blend stretchdibits

我想在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不允许混合。

1 个答案:

答案 0 :(得分:2)

StretchDIBits()没有任何alpha混合的概念。您必须首先将PNG blit到临时的32位位图,确保根据需要设置其Alpha通道,然后将AlphaBlend()临时位图放到目标位图上。或者,如果PNG已经使用32位位图布局在内存中,您可以直接AlphaBlend() PNG到目标位图。