gpt4 book ai didi

德尔福2006 : Run-time assignment of PNG to TImage loses alpha transparency

转载 作者:行者123 更新时间:2023-12-03 15:12:02 26 4
gpt4 key购买 nike

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) ; 

这成功了,因为分配没有破坏图像,但图像现在显示为不透明的半透明位,即:

TImage when assigned with Image1.Picture.Bitmap.Assign

而不是:

TImage when assigned with Image1.Picture.Assign

如何让该图像正确显示 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 ;

第一次调用打印 Logo 的例程时,它执行时没有错误,但在调用 PrintBitmapRect 后,LogoImage .Picture 被清除。下次调用打印头例程时,对 CalcGraphicHeight 的调用将失败,因为图像的宽度和高度为零。

将 Picture.Assign 更改为 Picture.Bitmap.Assign 修复了标题打印例程中的 RTE,但是当我将相同的“修复”移植到从 PNG 分配的其他静态图像(如上面的齿轮)时,我丢失了 aplha channel 。

最佳答案

您没有显示代码中真正相关的部分:您如何重用图像以使其具有特定类型。

当您将 TImage 分配给 TPngObject 时,图像的图形将保存一个 png 对象。只有当您专门请求位图时,它才会强制其图形为位图类型。比如说这个,

  Bmp.Assign(Image1.Picture.Bitmap);

将强制Image1有一个位图图形,如果它的图形是一个png对象,它将被释放。在此期间,

  Bmp.Assign(Image1.Picture.Graphic);

不会强制 Image1 具有位图图形,png 对象将执行分配并保留在那里。

Delphi 的位图(至少到最新版本)不支持 alpha channel ,因此您不应该将 Image1.Picture.Bitmap.Assign(..) 用于部分透明的图像。


顺便说一句,您可以使用 png 图像集合中的图像作为源,而不是重复使用图像中的图形。

关于德尔福2006 : Run-time assignment of PNG to TImage loses alpha transparency,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5372586/

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