Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 透明Png至TBitmap32_Delphi_Alpha Transparency_Graphics32 - Fatal编程技术网

Delphi 透明Png至TBitmap32

Delphi 透明Png至TBitmap32,delphi,alpha-transparency,graphics32,Delphi,Alpha Transparency,Graphics32,我有一个png,我想加载到TBitmap32中 加载位图后,我调用: Bitmap.DrawMode := dmTransparent; Bitmap.OuterColor := Bitmap.PixelS[0,0]; 但是所有的白色像素都是透明的。如何仅对png图像的透明部分执行此操作?这是我的图像,在图像边缘以标准方式显示alpha透明度 这是真实的图像: 似乎TBitmap32在加载PNG图像时可能会丢失alpha信息 你可以考虑使用一个文件摘录如下: 由于读取和写入使用中间TBi

我有一个png,我想加载到TBitmap32中

加载位图后,我调用:

Bitmap.DrawMode   := dmTransparent;
Bitmap.OuterColor := Bitmap.PixelS[0,0];
但是所有的白色像素都是透明的。如何仅对png图像的透明部分执行此操作?这是我的图像,在图像边缘以标准方式显示alpha透明度

这是真实的图像:


似乎
TBitmap32
在加载PNG图像时可能会丢失alpha信息

<>你可以考虑使用一个文件摘录如下:


由于读取和写入使用中间TBitmap对象,因此需要不必要的额外内存来存储位图数据。此外,通过将数据转换为TBitmap格式或从TBitmap格式转换为TBitmap格式,其他信息可能会丢失或处理错误。

要通过图形32本机处理PNG文件,可以使用第三方库GR32 PNG库。此库使用本机PNG格式作为中间存储。通过分配一个TBitmap32对象,数据被动态地编码/解码到PNG或从PNG解码。使用此库还可以访问存储在PNG文件中的其他信息


该装置的代码使用示例可按如下所示进行更改,以满足您的需要:

var
  AlphaChannelUsed: Boolean;
begin
  LoadBitmap32FromPNG(Bitmap, <your path to the PNG image>, AlphaChannelUsed);

  if AlphaChannelUsed then
    Bitmap.DrawMode := dmBlend
  else
    Bitmap.DrawMode := dmOpaque;
end;
var
所用字母:布尔;
开始
LoadBitmap32FromPNG(位图,使用字母通道);
如果使用字母通道,则
Bitmap.DrawMode:=dmBlend
其他的
Bitmap.DrawMode:=dmOpaque;
结束;
其中
Bitmap
TBitmap32
对象


TImage32
组件中的形式加载的结果图像:


问题可能是PNG错误地转换为TBitmap32,在传输过程中丢失了透明度信息。这是调色板PNG图像的常见情况。否则,您就不必使用“位图.DrawMode:=dmTransparent”和“OuterColor”。如果PNG中的透明信息已正确传输到TBitmpa32,则DrawMode:=dmBlend将起作用,而无需设置OuterColor

最重要的是如何将PNG加载到TBitmap32中。来自Vcl.Imaging.pngimage单元(在Delphi XE2和更高版本中实现)的TPngImage可以在位图上透明地绘制,保留位图上的内容,使用PNG alpha层组合颜色等,但它不允许轻松转换PNG透明度的各种格式(包括调色板)进入TBitmap32每个像素的alpha分量。TPngImage绘制图像后,将获得每个像素的组合RGB,但alpha分量不会传输到目标位图

有一些帮助程序可以尝试将PNG加载到透明的TBitmap32中,但它们有缺点:

(1) “LoadPNGintoBitmap32”来自 -它会应用透明度两次,因此alpha值不是0或255的图像看起来与其他软件中的图像不同(在具有玻璃效果的半透明图像上最为明显)。此代码将首先将alpha应用于RGB,然后将alpha设置为单独的层,因此在绘制时,alpha将再次应用。您可以在此处找到有关此问题的更多信息: . 此外,它不能正确地将调色板图像的透明度转换为TBitmap32的alpha层。它们为输出位图(渲染为RGB)的特定颜色的像素手动设置alpha透明度,而不是在渲染为RGB之前设置alpha透明度,因此当所有白色像素都是透明的时,实际透明度将丢失,就像在示例图像上一样

(2) gr32ex库中的“LoadBitmap32FromPNG”: -与(1)相同算法的实现略有不同,并且与(1)具有相同的问题

因此,解决办法是:

  • 不要使用TBitmap32;使用Vcl.Imaging.pngimage.TPngImage直接在目标位图(屏幕等)上绘制–这是正确处理各种PNG格式的最兼容方式
  • 使用辅助路由将透明度信息从Vcl.Imaging.pngimage.TPngImage传输到TBitmap32
  • 使用GR32 PNG库

  • 既然您现在掌握了有关此问题的所有信息,您可以为自己选择正确的解决方案。

    为什么要设置
    DrawMode
    OuterColor
    ?听起来你得到了你想要的。换句话说,
    TBitmap32
    肯定会尊重图像的alpha透明度。