How to save a png file with transparency?

前端 未结 2 1625
北海茫月
北海茫月 2021-01-13 09:25

I am using Barcode Studio 2011 to paint a QR Code into a Graphics32 - TImage32 Component and I want to save it in png format but with the white colour as transparent this I

相关标签:
2条回答
  • 2021-01-13 09:57

    This approach works for me:

    uses GR32, GR32_PNG, GR32_PortableNetworkGraphic;
    
    var
      Y: Integer;
      X: Integer;
      Png: TPortableNetworkGraphic32;
    
      function IsWhite(Color32: TColor32): Boolean;
      begin
        Result:= (TColor32Entry(Color32).B = 255) and
                 (TColor32Entry(Color32).G = 255) and
                 (TColor32Entry(Color32).R = 255);
      end;
    
    begin
      with Image321 do
      begin
        Bitmap.ResetAlpha;
        for Y := 0 to Bitmap.Height-1 do
          for X := 0 to Bitmap.Width-1 do
          begin
            if IsWhite(Bitmap.Pixel[X, Y]) then
              Bitmap.Pixel[X,Y]:=Color32(255,255,255,0);
          end;
        Png:= TPortableNetworkGraphic32.Create;
        Png.Assign(Bitmap);
        Png.SaveToFile('C:\Temp\NowTransparent.png');
        Png.Free;
      end;
    end;
    

    This uses the GR32 PNG library. It's a pretty direct way, setting all white pixels to transparent.

    PS: Image321 is a TImage32 component, containing my TBitmap32.

    0 讨论(0)
  • 2021-01-13 10:05

    You haven't specified the Delphi version, but if your delphi version has "PngImage"(I believe it comes with D2009+) the code bellow works perfectly(loaded in Gimp and Windows Photo Viewer, it draws a frame and some text with transparent background, feel free to play with it:

    uses
      PngImage;
    
    procedure TForm1.OnBtnClick(Sender: TObject);
    var
      bmp: TBitmap;
      png: TPngImage;
    begin
      bmp := TBitmap.Create;
      bmp.Width := 200;
      bmp.Height := 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;
    
    0 讨论(0)
提交回复
热议问题