Библиотека PNG для чтения и написания изображений PNG в сочетании с классом TBITMAP32 из библиотеки GR32.
Чтобы использовать библиотеку, убедитесь, что вы используете устройство GR32_PNG. В этом устройстве используется GR32_portablenetWorkgraphics для чтения и записи файлов PNG, что делает необходимым добавление файла в ваш проект. Или просто добавьте каталог в путь библиотеки.
Самый простой способ загрузить PNG в экземпляр TBITMAP32 - это использование:
LoadBitmap32FromPNG(Bitmap: TBitmap32; const Filename: string);
Вы можете проверить, является ли файл действительным файлом PNG с помощью
function IsValidPNG(const Filename: string): Boolean;
Если файл PNG поступает из потока, который можно использовать также
LoadBitmap32FromPNG(Bitmap: TBitmap32; Stream: TStream);
как в
var
MemoryStream: TMemoryStream;
begin
MemoryStream := TMemoryStream.Create;
try
MemoryStream.LoadFromFile(FileName);
LoadBitmap32FromPNG(Bitmap, Stream);
finally
MemoryStream.Free;
end;
end;
Это может быть особенно полезно, если файл PNG встроен в качестве ресурса в исполняемый файл. В этом случае вы можете легко использовать tresourcestream
Чтобы сохранить содержимое экземпляра TBITMAP32 в файл PNG или транслировать функции:
procedure SaveBitmap32ToPNG(Bitmap: TBitmap32; FileName: string);
procedure SaveBitmap32ToPNG(Bitmap: TBitmap32; Stream: TStream);
можно использовать.
Если вы используете простые функции, вы не сможете отслеживать прогресс во время загрузки. Для этого вы должны создать экземпляр TportablenetWorkGraphic32 и загрузить файл PNG вручную. Перед фактической загрузкой вы можете указать обработчик Onprogress для отслеживания прогресса. Затем код будет выглядеть так:
with TPortableNetworkGraphic32.Create do
try
OnProgress := OnProgressHandler;
LoadFromFile(Filename);
AssignTo(YourBitmap); // can be Image32.Bitmap for example
finally
Free;
end;
Где может выглядеть ProgrescressHandler:
procedure TForm1.OnProgressHandler(Sender: TObject; Percent: Single);
begin
ProgressBar.Position := Round(Percent);
end;
Если вы хотите изменить некоторые настройки во время сохранения, вам также нужно сделать это вручную. Код может выглядеть так:
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;
С текущим состоянием реализации невозможно изменить все, не заканчивая в неверном файле PNG. Например, вы можете преобразовать изображение, чтобы использовать паллету, а затем изменить или удалить палитру перед сохранением. Это не даст вам ошибки, но, скорее всего, изображение не будет читаемым другими программами (или, по крайней мере, отличается от исходного изображения).