2

我想在 32 位位图(或 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 不允许混合。

4

1 回答 1

2

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

于 2012-05-11T02:26:15.943 回答