3
votes

I have a Delphi bitmap (32Bit) that has transparency information. I need to convert and save it to a PNG file while preserving the transparency.

The tools I currently have are the graphics32 Library, GR32_PNG (by Christian Budde), and PNGImage (by Gustavo daud).

What is the best way to do this?

EDIT 1 : There is not just one color in my bitmap that's transparent but pixels with varying levels of transparency that needs to be preserved.

EDIT 2 : I am getting my bitmap with alpha information by setting the background of an image to a PNG I have with nothing but an empty alpha layer. Then I write anti-aliased text onto it. I then save the bitmap. When opened with gimp it show the transparency and upon zooming in you can see the effect of anti-aliasing.

3

3 Answers

4
votes

Use PNGImage. In Delphi, try this:

function ConvertToPNG(oBMPSrc: TBitmap; sFilename: String);
var
  oPNGDest: TPNGObject;
begin
  oPNGDest := TPNGObject.Create;
  try
    oPNGDest.Assign(oBMPSrc);
    oPNGDest.SaveToFile(sFilename); 
  finally
    oPNGDest.Free;
  end;
end;

If that doesn't work for you, you'll probably have to copy over the alpha and RGB values individually.

function ConvertToPNG(oBMPSrc: TBitmap; sFilename: String);
var
  oPNGDest: TPNGObject;
begin
  oPNGDest := TPNGObject.CreateBlank(COLOR_RGBALPHA, 8, oBMPSrc.Width, oBMPSrc.Height);
  try
    oPNGDest.CreateAlpha;
    // Copy over RGB
    ..
    // Copy over Alpha
    ..
    // Save to file
    oPNGDest.SaveToFile(sFilename); 
  finally
    oPNGDest.Free;
  end;
end;
3
votes

I could not get either of the other two answer to work. They may work for others but here is what I did.

  1. I created the bitmap with transparency.
  2. Assigned it to a TBitmap32 from the Graphics 32 library.
  3. Assigned it to a TPortableNetworkGraphics32 from Christian Budde's GR32_PNG for Graphics32
  4. Called the TPortableNetworkGraphics32.SaveToFile method
1
votes

Check out this link

There is a function:

function WriteBitmapToPngFile( Filename : string; Bitmap : TBitmap; TransparentColor:TColor):boolean;