Napotkałem na ciekawą rzecz spowodowaną prawdopodobnie brakiem wiedzy z mojej strony :/
uses PNGImage;
procedure test;
var
Picture: TPicture;
PNGObject: TPNGObject;
MStream : TMemoryStream;
FStream : TFileStream;
begin
// Ładowanie PNG
FStream := TFileStream.Create('c:\plik.png',fmOpenRead);
MStream := TMemoryStream.Create;
Picture := TPictureCreate;
Picture.LoadFromFile('c:\plik.png');
Picture.Graphic.SaveToStream(MStream);
//Dla pewności
MStream.SaveToFile('c:\nowy.bmp'); //Mimo iż rozszerzenie bmp to na dysku zapisał się plik PNG tyle że o rozszeżeniu BMP
//PNG
PNGObject := TPngObject.Create;
PNGObject.LoadFromStream(FStream); //To się wykonuje prawidłowo
PNGObject.LoadFromStream(MStream); //To wywala błąd
end;
Błąd spowodowany jest tym kodem:
{Loads the image from a stream of data}
procedure TPngImage.LoadFromStream(Stream: TStream);
var
Header : Array[0..7] of AnsiChar;
HasIDAT : Boolean;
{Chunks reading}
ChunkCount : Cardinal;
ChunkLength: Cardinal;
ChunkName : TChunkName;
begin
{Initialize before start loading chunks}
ChunkCount := 0;
ClearChunks();
{Reads the header}
Stream.Read(Header[0], 8);
{Test if the header matches}
if Header <> PngHeader then //<--- Header jest pusty
begin
RaiseError(EPNGInvalidFileHeader, EPNGInvalidFileHeaderText);
Exit;
end;
Jak rozwiązać problem aby MStream zostało załadowane przez PNGObject?