gpt4 book ai didi

Delphi:GR32 将带有 alpha 的 PNG 绘制到 TBitmap32 上,而不清除其内容

转载 作者:行者123 更新时间:2023-12-02 01:54:42 24 4
gpt4 key购买 nike

在解决了其他几个相关问题后,我无法为此提供有效的代码,因此请保留“重复问题”标签。

给定一个具有每像素 alpha channel 或单色透明度的 PNG 图像,我需要代码将其绘制到已经包含图像的 TBitmap32 上(一些绘制在 PNG 部分之前进行)。假设我的 TBitmap32 是 200x200,我在上面做了一些绘制,然后我想在其当前内容之上插入一个较小的透明 PNG 图像,根据 PNG 的 Alpha channel 数据或单色 Alpha 进行透明。

Uses pngimage, GR32;

procedure TForm1.Button1Click(Sender: TObject);
Var b: TBitmap;
b32: TBitmap32;
p: TPngImage;
begin
b := TBitmap.Create;
b32 := TBitmap32.Create;
p := TPngImage.Create;

// 50x50 PNG
p.LoadFromFile('z:\test2.png');

b.Width := 200;
b.Height := 200;
b32.Width := 200;
b32.Height := 200;
// some drawing happens on the b32~

// insert code here to draw the png onto the b32, on top of
// what's already drawn, and at specific coordinates i.e 10,10


/////////////////////////////

b32.DrawTo(b.Canvas.Handle,0,0);
Canvas.Draw(0,0,b);

p.Free;
b32.Free;
b.Free;
end;

原始PNG:

enter image description here

到目前为止的结果:

enter image description here

最佳答案

有两种处理透明 PNG 文件的方法:

  1. 将它们加载到中间 TBitmap32 位图中,然后操作这些 TBitmap32 位图。
  2. 直接在 objective-c anvas 上使用 TPngImage.Draw (在 Delphi XE2 及更高版本的 Vcl.Imaging.pngimage 中实现),正如您所指出的。

就透明度而言,第二种方法更可取,因为您可能会发现将 PNG 加载到 TBitmap32 中的代码可能无法正常工作。以下是最常使用的错误代码的两个示例:

(1) 来自 http://graphics32.org/wiki/FAQ/ImageFormatRelated 的“LoadPNGintoBitmap32”- 它应用透明度两次,因此 alpha 值不是 0 或 255 的图像看起来与其他软件不同(在具有玻璃效果的半透明图像上最明显)。此代码将首先将 alpha 应用到 RGB,然后设置 alpha,因此当您感到疼痛时,将再次应用 alpha。您可以在此处找到有关此问题的更多信息:Delphi, GR32 + PngObject: converting to Bitmap32 doesn't work as expected。除此之外,它无法将调色板图像的透明度正确转换为 TBitmap32 的 Alpha 层,例如,所有白色像素都变为透明。

(2) gr32ex 库中的“LoadBitmap32FromPNG”:https://code.google.com/archive/p/gr32ex/- 与(1)相同的算法的实现略有不同,并且具有与(1)相同的问题。

如果您仍然喜欢使用 TBitmap32,请执行以下步骤:

  1. 确保您的代码正确地将 PNG 转换为 TBitmap32。
  2. 不要使用带有透明图像的TBitmap32直接在HDC、Canvas或TBitmap上绘制。使用 dmBlend 和 DrawTo 或 BlockTransfer() 在另一个 TBitmap32 上绘图。例如,要在 TBitmap 上透明绘制,请创建一个中间缓存 TBitmap32:
    1. 将图像从TBitmap复制到缓存TBitmap32;
    2. 使用 DrawTo 或 BlockTransfer() 将透明图像应用到缓存 TBitmap32,避免使用 Canvas 或 HDC 混合两个图像,因为它们会丢失 alpha 层信息;
    3. 将图像从缓存 TBitmap32 复制回您的 TBitmap。

关于Delphi:GR32 将带有 alpha 的 PNG 绘制到 TBitmap32 上,而不清除其内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39812396/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com