我试图将gif转换为png,这很容易,但问题是结果图像不透明,我也希望在png图像中有alpha通道.
这是我的代码:
procedure TForm1.Button1Click(Sender: TObject); var png: TPngImage; p : TPicture; begin p := TPicture.Create; p.LoadFromFile('C:\temp\PHP.gif'); png := TPngImage.CreateBlank(COLOR_RGB,8,p.Width,p.Height); png.Canvas.Draw(0,p.Graphic); png.SavetoFile('C:\Windows\Temp\test.png'); end;
新图片的背景为黑色,应该是透明的.
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:\temp\PHP.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:\Windows\Temp\test.png'); end;