Delphi 2006 的 TImage 不太支持 PNG。为了在我的表单上显示具有 alpha 透明度的图像,我必须在运行时加载它们。我可以在设计时加载它们,但它们无法生存,我认为是因为 PNG 没有保存在 DFM 文件中。我确信这在最新的 Delphi 中都是笨拙的,但我目前无法升级。
无论如何,我在运行时加载它们:
Image1.Picture.Assign (PngImageCollection1.Items [0].PNGImage) ;
PNGImageCollection 组件包含我所有的各种大小的 PNG(这些是在设计时创建和加载的),我将它们分配给 FormCreate 事件中的相应 TImage。
这工作正常,直到我遇到问题,在表格上使用这些图像后,我试图在其他地方重用这些图像。我发现分配 TPicture 的行为已将其设置为空图像作为分配的结果。这发生在例程 TPicture.ForceType 中,AFAICT 检查 FGraphic 的类型,如果它不是所需的类型,它会释放 FGraphic 并创建所请求类型的新实例。
好的。因此,经过一番摸索,我发现也许我真的应该这样做:
Image1.Picture.Bitmap.Assign (PngImageCollection1.Items [0].PNGImage) ;
这起到了作用,因为分配没有破坏图像,但图像现在显示为不透明的半透明位,即:
代替:
如何让此图像正确显示 alpha 透明位?(和补充问题:Image1.Picture.Bitmap.Assign 是正确的方法吗?)。
这是更详细的代码:
在我遇到“重用”TImage 问题的代码中,顺序是:
在表单创建上:
LogoImage.Picture.Assign (PngImageCollection1.Items [0].PNGImage) ;
(PNGIMage 是公司标志,LogoImage1 在主窗体上)。
在打印报告标题上:
procedure PrintLogo (Report : TBaseReport) ;
var
X1, Y1, LogoHeightMM : Double ;
begin
with Report do
begin
LogoHeightMM := CalcGraphicHeight (LogoWidthMM, MainForm.LogoImage.Picture.Graphic) ;
X1 := PageWidth - MarginRight - LogoWidthMM ;
Y1 := SectionBottom - LogoHeightMM ;
PrintBitmapRect (X1, Y1, X1 + LogoWidthMM, Y1 + LogoHeightMM, MainForm.LogoImage.Picture.Bitmap) ;
end ;
end ;
第一次调用打印徽标的例程时,它会正常执行,但在调用 PrintBitmapRect 后,LogoImage .Picture 会被清除。下次调用打印头例程时,对 CalcGraphicHeight 的调用将失败,因为图像的宽度和高度为零。
将 Picture.Assign 更改为 Picture.Bitmap.Assign 修复了标题打印例程中的 RTE,但是当我将相同的“修复”移植到从 PNG 分配的其他静态图像(如上面的齿轮)时,我失去了 aplha 通道。