加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi将gif转换为具有透明度的png

发布时间:2020-12-15 09:37:04 所属栏目:大数据 来源:网络整理
导读:我试图将gif转换为png,这很容易,但问题是结果图像不透明,我也希望在png图像中有alpha通道. 这是我的代码: procedure TForm1.Button1Click(Sender: TObject);varpng: TPngImage; p : TPicture;begin p := TPicture.Create; p.LoadFromFile('C:tempphp.gif'
我试图将gif转换为png,这很容易,但问题是结果图像不透明,我也希望在png图像中有alpha通道.

这是我的代码:

procedure TForm1.Button1Click(Sender: TObject);
var
png: TPngImage;
 p : TPicture;
begin
 p := TPicture.Create;
 p.LoadFromFile('C:tempphp.gif');
 png := TPngImage.CreateBlank(COLOR_RGB,8,p.Width,p.Height);
 png.Canvas.Draw(0,p.Graphic);
 png.SaveToFile('C:WindowsTemptest.png');
end;

新图片的背景为黑色,应该是透明的.

如果我尝试在构造函数中添加ALPHA,则100%透明.

png := TPngImage.CreateBlank(COLOR_RGBALPHA,p.Height);

解决方法

只需在PNG画布上绘制GIF图像,就不会将透明度信息从GIF图像移动到PNG.
你必须自己做.

ForceAlphaChannel过程将根据给定的TransparentColor为任何PNG图像创建Alpha通道.

procedure ForceAlphaChannel(Image: TPngImage; BitTransparency: Boolean; TransparentColor: TColor; Amount: Byte);
var
  Temp: TPngImage;
  x,y: Integer;
  Line: VCL.Imaging.PngImage.pByteArray;
  PixColor: TColor;
begin
  Temp := TPngImage.CreateBlank(COLOR_RGBALPHA,Image.Width,Image.Height);
  try
    for y := 0 to Image.Height - 1 do
      begin
        Line := Temp.AlphaScanline[y];
        for x := 0 to Image.Width - 1 do
          begin
            PixColor := Image.Pixels[x,y];
            Temp.Pixels[x,y] := PixColor;
            if BitTransparency and (PixColor = TransparentColor) then Line^[x] := 0
            else Line^[x] := Amount;
          end;
      end;
    Image.Assign(Temp);
  finally
    Temp.Free;
  end;
end;

如果在绘制GIF图像后添加对ForceAlphaChannel的调用,则将根据您定义的透明颜色获得透明度.

procedure TForm1.Button1Click(Sender: TObject);
var
png: TPngImage;
 p : TPicture;
 TransparentColor: TColor;
begin
 p := TPicture.Create;
 p.LoadFromFile('C:tempphp.gif');
 TransparentColor := clFuchsia;
 png := TPngImage.CreateBlank(COLOR_RGB,p.Height);
 // set png background color to same color that will be used for setting transparency
 png.Canvas.Brush.Color := TransparentColor;
 png.Canvas.FillRect(rect(0,p.Height));
 png.Canvas.Draw(0,p.Graphic);
 ForceAlphaChannel(png,true,TransparentColor,255);
 png.SaveToFile('C:WindowsTemptest.png');
end;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读