Biblioteca PNG para leitura e escrita de imagens PNG em combinação com uma classe TBITMAP32 da biblioteca GR32.
Para usar a biblioteca, verifique se você usa a unidade gr32_png. Esta unidade usa gr32_portableNetworkGraphics para ler e gravar arquivos PNG, o que torna necessário adicionar o arquivo ao seu projeto também. Ou apenas adicione o diretório ao caminho da biblioteca.
A maneira mais simples de carregar um PNG em uma instância TBITMAP32 é usando:
LoadBitmap32FromPNG(Bitmap: TBitmap32; const Filename: string);
Você pode verificar se o arquivo é um arquivo PNG válido usando
function IsValidPNG(const Filename: string): Boolean;
Se o arquivo PNG vier de um fluxo, um também poderá usar
LoadBitmap32FromPNG(Bitmap: TBitmap32; Stream: TStream);
como em
var
MemoryStream: TMemoryStream;
begin
MemoryStream := TMemoryStream.Create;
try
MemoryStream.LoadFromFile(FileName);
LoadBitmap32FromPNG(Bitmap, Stream);
finally
MemoryStream.Free;
end;
end;
Isso pode ser especialmente útil se o arquivo PNG for incorporado como recurso no executável. Nesse caso, você pode usar facilmente o TresourceStream
Para salvar o conteúdo de uma instância TBITMAP32 em um arquivo PNG ou transmitir as funções:
procedure SaveBitmap32ToPNG(Bitmap: TBitmap32; FileName: string);
procedure SaveBitmap32ToPNG(Bitmap: TBitmap32; Stream: TStream);
pode ser usado.
Se você usar as funções simples, não poderá acompanhar o progresso durante o carregamento. Para isso, você deve criar uma instância do TPortableNetworkGraphic32 e carregar o arquivo PNG manualmente. Antes de realmente carregar, você pode especificar um manipulador onprogresso para rastrear o progresso. O código ficará assim:
with TPortableNetworkGraphic32.Create do
try
OnProgress := OnProgressHandler;
LoadFromFile(Filename);
AssignTo(YourBitmap); // can be Image32.Bitmap for example
finally
Free;
end;
Onde o OnProgressHandler pode se parecer com o seguinte:
procedure TForm1.OnProgressHandler(Sender: TObject; Percent: Single);
begin
ProgressBar.Position := Round(Percent);
end;
Se você deseja alterar algumas configurações enquanto economiza, também precisa fazer isso manualmente. O código pode então ficar assim:
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;
Com o estado atual de implementação, não é possível alterar tudo sem terminar em um arquivo PNG inválido. Por exemplo, você pode converter a imagem para usar um palete e alterar ou excluir a paleta antes de salvar. Isso não lhe dará um erro, mas provavelmente a imagem não será legível por outros programas (ou pelo menos diferente da imagem original).