Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Catalog · How the catalog works

Random project

GR32PNG

The GR32PNG library has been incorporated into the Graphics32 library and is no longer independently maintained.

View on GitHub

Anyone may press Interesting, signed in or not. It helps others find this project.

Member rating

No ratings yet.

Sign in to rate this project.

README

GR32PNG

PNG library for reading and writing of PNG images in combination with a TBitmap32 class from the GR32 library.

Usage

In order to use the library ensure that you use the unit GR32_PNG. This unit uses GR32_PortableNetworkGraphics to read and write PNG files, which makes it necessary to add the file to your project as well. Or just add the directory to the library path.

The simplest way to load a PNG to a TBitmap32 instance is by using:

pascal
LoadBitmap32FromPNG(Bitmap: TBitmap32; const Filename: string);

You can check if the file is a valid PNG file by using

pascal
function IsValidPNG(const Filename: string): Boolean;

If the PNG file comes from a stream one can also use

pascal
LoadBitmap32FromPNG(Bitmap: TBitmap32; Stream: TStream);

like in

pascal
var
  MemoryStream: TMemoryStream;
begin
  MemoryStream := TMemoryStream.Create;
  try
    MemoryStream.LoadFromFile(FileName);
    LoadBitmap32FromPNG(Bitmap, Stream);
  finally
    MemoryStream.Free;
  end;
end;

This might be especially useful if the PNG file is embedded as resource into the executable. In this case you can easily use TResourceStream

To save the content of a TBitmap32 instance to a PNG file or stream the functions:

pascal
procedure SaveBitmap32ToPNG(Bitmap: TBitmap32; FileName: string);
procedure SaveBitmap32ToPNG(Bitmap: TBitmap32; Stream: TStream);

can be used.

Advanced Usage

If you use the simple functions you won't be able to track the progress during loading. To do so you must create an instance of TPortableNetworkGraphic32 and load the PNG file manually. Before actually loading you can specify an OnProgress handler to track the progress. The code will then look like this:

pascal
with TPortableNetworkGraphic32.Create do
try
  OnProgress := OnProgressHandler;
  LoadFromFile(Filename);
  AssignTo(YourBitmap); // can be Image32.Bitmap for example
finally
  Free;
end;

Where the OnProgressHandler might looks like this:

pascal
procedure TForm1.OnProgressHandler(Sender: TObject; Percent: Single);
begin
  ProgressBar.Position := Round(Percent);
end;

If you want to change some settings while saving you need to do this manually as well. The code can then look like this:

pascal
with TPortableNetworkGraphic32.Create do
try
  AssignTo(YourBitmap); // can be Image32.Bitmap for example
  Interlaced := imAdam7; // save as interlaced png file
  SaveToFile(Filename);
finally
  Free;
end;

With the current state of implementation it's not possible to alter everything without ending in an invalid PNG file. For example you could convert the image to use a pallete and then alter or delete the palette before saving. Doing so will not give you an error, but most probably the image won't be readable by other programs (or at least different to the original image).