Delphi:ImageList中的PNG,改变颜色同时保持alpha

标签 delphi png alpha imagelist

德尔福。

我有一个 ImageList(TImageList 或 DevExpress 的 TcxImageList),其中包含使用 Alpha channel 的 PNG 图片。图片的RGB部分是一个黑色的方 block 。 Alpha channel 包含真实图片的形状。我想改变黑色方 block 的颜色,同时保持 Alpha channel 的形状。 (所以最终我改变了图片形状图标的颜色。)

尝试了很多方法,都没有成功。我尝试更改列表的属性,并导出 RGB 和 alpha 分离的值。

TImageList: mask 未导出。如果我执行 SaveToFile,它会保存一个 0 字节文件,并且 Replace 还会说掩码的大小不正确(0*0 px)

BMPimg := TBitmap.Create;
BMPmask := TBitmap.Create;
Try
  TImageListHack(il1).GetImages(0, BMPimg, BMPmask);
  BMPimg.Canvas.Brush.Color := clRed;
  BMPimg.Canvas.FillRect(TRect.Create(0, 0, BMPimg.Width, BMPimg.Height));
  il1.Replace(i, BMPimg, BMPmask);
  End;
Finally
  BMPimg.Free;
  BMPmask.Free;
End;

TcxImageList:将图片+ mask 加载到BMPimg中, mask 是一个黑色的方 block ,而不是BMPmask中的形状。

BMPimg := TBitmap.Create;
BMPmask := TBitmap.Create;
Try
  il1.GetBitmap(i, BMPimg);
  il1.GetMask(i, BMPmask);
  BMPimg.Canvas.Brush.Color := clRed;
  BMPimg.Canvas.FillRect(TRect.Create(0, 0, BMPimg.Width, BMPimg.Height));
  il1.Replace(i, BMPimg, BMPmask);
Finally
  BMPimg.Free;
  BMPmask.Free;
End;

如何更改前景色,同时保留 imagelist 的 PNG 图像中的 Alpha channel ?

最佳答案

呃呃。

我必须手动设置 BMPmask 的大小,然后蒙版才正确。

...
BMPmask.Width := il1.Width;
BMPmask.Height := il1.Height;
TImageListHack(il1).GetImages(0, BMPimg, BMPmask);
...

关于Delphi:ImageList中的PNG,改变颜色同时保持alpha,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55274885/

相关文章:

德尔福 DFM 检查器

html - 引用网站图标时,MIME 类型声明(使用 type 属性)是否是必需的?

png - 在 libpng 中重用 pngPtr 和 infoPtr

android - 错误.xml "error: Error parsing XML: unbound prefix"

java - 增加不透明度,想要恒定的不透明度 Image View with Drawable

delphi - 为什么德尔福说 'cannot resolve unit name xxx'?

delphi - 为什么TStringStream转换为字符串时不去掉BOM?

delphi - 在 TRESTResponse 中自动解码 GZIP?

png - 使用 Pillow 保存为 JPEG 的图像与原始图像不同。

c - Alpha Blending C 中的 2 种 RGBA 颜色