【发布时间】:2011-07-19 08:36:36
【问题描述】:
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频道。
【问题讨论】:
-
我建议放弃问题上的其中一个标签,转而支持
Delphi。应该有些开发者过去使用过以前的版本,但目前没有关注他们的标签。.. -
最好是尝试在一个非常小的测试用例中重现,然后从那里开始工作。如果您可以发布那个小测试用例,它会很有帮助。
标签: delphi png delphi-2006 timage alpha-transparency