如何从位图创建透明的png图像?

时间:2012-06-13 10:16:22

标签: image delphi bitmap png alpha-transparency

我的任务是:

  1. 创建TBitmap对象。
  2. 用透明色填充(alpha = 0)。
  3. 将此位图分配给TPngImage。
  4. 使用Alpha透明度保存PNG文件。
  5. 如何在Delphi XE中完成?

    var
      Png: TPngImage;
      X, Y: Integer;
      Bitmap: TBitmap;
    begin
      Bitmap := TBitmap.Create();
      Bitmap.PixelFormat := pf32bit;
      Png := TPngImage.Create();
      try
        Bitmap.SetSize(100, 100);
    
        // How to clear background in transparent color correctly?
        // I tried to use this, but the image in PNG file has solid white background:
        for Y := 0 to Bitmap.Height - 1 do
          for X := 0 to Bitmap.Width - 1 do
            Bitmap.Canvas.Pixels[X, Y]:= $00FFFFFF;
    
        // Now drawing something on a Bitmap.Canvas...
        Bitmap.Canvas.Pen.Color := clRed;
        Bitmap.Canvas.Rectangle(20, 20, 60, 60);
    
        // Is this correct?
        Png.Assign(Bitmap);
        Png.SaveToFile('image.png');
      finally
        Png.Free();
        Bitmap.Free();
      end;
    end;
    

1 个答案:

答案 0 :(得分:4)

或多或少Dorin's answer的副本。 它显示了如何制作透明的png图像以及如何清除背景。

uses
  PngImage;
...

var
  bmp: TBitmap;
  png: TPngImage;
begin
  bmp := TBitmap.Create;
  bmp.SetSize(200,200);

  bmp.Canvas.Brush.Color := clBlack;
  bmp.Canvas.Rectangle( 20, 20, 160, 160 );

  bmp.Canvas.Brush.Style := bsClear;
  bmp.Canvas.Rectangle(1, 1, 199, 199);

  bmp.Canvas.Brush.Color := clWhite;
  bmp.Canvas.Pen.Color := clRed;
  bmp.Canvas.TextOut( 35, 20, 'Hello transparent world');

  bmp.TransparentColor := clWhite;
  bmp.Transparent := True;

  png := TPngImage.Create;
  png.Assign( bmp );
  png.SaveToFile( 'C:\test.png' );

  bmp.Free;
  png.Free;
end;