如何禁用PNG图片的透明度

3
如何完全禁用给定的 PNGObject 的透明度?顺便说一下,我正在使用版本为1.564的 PNGImage 单元。

3
禁用透明度的意思是什么?你想将颜色格式/位深度设置为Truecolor吗?也就是每像素24位,没有alpha通道。 - David Heffernan
@罗伯茨,你为什么想要没有透明度的PNG呢?我猜如果你想要它,你可以将TPngImage对象分配给一个新的TBitmap对象,然后再将TBitmap对象重新分配给TPngImage对象。我不确定这是否会起作用,但我认为应该可以。 - bjaastad_e
@Elling 我已经尝试过了:D。没有用:D。 - Little Helper
@Roberts 好的。我现在手头没有 Delphi,所以无法帮助您进一步调查。但是,我看到类似的问题之前已经在 stackoverflow 上提出过。也许那个问题的答案中有一些帮助:https://dev59.com/8EjSa4cB1Zd3GeqPFndU - bjaastad_e
@Elling TBitmap支持部分透明度。 - David Heffernan
2个回答

8
我认为永久禁用TPNGObject图像透明是不可能的。或者说,我找不到这个属性。因为当你分配或加载一个图像时,TPNGObject会从被分配的图像文件中获取图像参数(包括透明度),所以它应该由属性来控制。
作为一种解决方法,我建议在加载或分配图像后使用RemoveTransparency过程:
uses
  PNGImage;

procedure TForm1.Button1Click(Sender: TObject);
var
  PNGObject: TPNGObject;
begin
  PNGObject := TPNGObject.Create;
  try
    PNGObject.LoadFromFile('C:\Image.png');
    PNGObject.RemoveTransparency;
    PNGObject.Draw(Canvas, Rect(0, 0, PNGObject.Width, PNGObject.Height));
  finally
    PNGObject.Free;
  end;
end;

2

如果只是想将TPNGObject(Delphi PNGComponents库)绘制到某个背景颜色(例如:白色)上并进行alpha混合,请尝试以下操作:

uses 
  PNGImage, PNGFunctions;

procedure TForm1.Button1Click(Sender: TObject);
var png: TPNGObject;
    bmp: TBitmap;
begin
  try
    // load PNG
    png := TPNGObject.Create;
    png.LoadFromFile('MyPNG.png');

    // create Bitmap
    bmp := TBitmap.Create;
    bmp.Width  := png.Width;
    bmp.Height := png.Height;

    // set background color to whatever you want
    bmp.Canvas.Brush.Color := clWhite;
    bmp.Canvas.FillRect(Rect(0, 0, png.Width, png.Height));

    // draw PNG on Bitmap with alpha blending
    DrawPNG(png, bmp.Canvas, Rect(0, 0, png.Width, png.Height), []);

    // save Bitmap
    bmp.SaveToFile('MyBMP.bmp');

  finally
    FreeAndNil(png);
    FreeAndNil(bmp);
  end;
end;

要使用DrawPNG过程,您需要包含PNGFunctions单元。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接