- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在解决了其他几个相关问题后,我无法为此提供有效的代码,因此请保留“重复问题”标签。
给定一个具有每像素 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:
到目前为止的结果:
最佳答案
有两种处理透明 PNG 文件的方法:
就透明度而言,第二种方法更可取,因为您可能会发现将 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,请执行以下步骤:
关于Delphi:GR32 将带有 alpha 的 PNG 绘制到 TBitmap32 上,而不清除其内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39812396/
我有两列布局 Left pane item 1 it
我是一名优秀的程序员,十分优秀!