Determinare il formato di un immagine in uno Stream in Delphi
Determinare di che formato è un’immagine in uno stream è un problema comune, in questo esempio il codice è scritto in Delphi ma come concetto è facilmente trasportabile in qualsiasi altro formato.
Nei primi bytes di un’immagine di qualsiasi formato viene messa una firma che identifica lo stesso in modo univo, nell’esempio ci limitiamo ad inserire i formati JPEG, PNG e GIF.
Nell’esempio specifico, una procedura che legge l’immagine da un memoryStream passato come parametro, e popola un TPicture che è la classe basse dei componenti TImage (quelli appunto per vedere le immagini a video) capendo il formato dal contenuto dello stream e istanziando la classe di gestione relativa.
procedure getImage(FS : TMemoryStream; Picture: TPicture);
var
FirstBytes: AnsiString;
Graphic: TGraphic;
begin
Graphic := nil;
try
SetLength(FirstBytes, 8);
FS.Read(FirstBytes[1], 8);
if Copy(FirstBytes, 1, 2) = 'BM' then
begin
Graphic := TBitmap.Create;
end else
if FirstBytes = #137'PNG'#13#10#26#10 then
begin
Graphic := TPNGObject.Create;
end else
if Copy(FirstBytes, 1, 3) = 'GIF' then
begin
// Graphic := TGIFImage.Create;
raise exception.Create('GIF non supportate al momento');
end else
if Copy(FirstBytes, 1, 2) = #$FF#$D8 then
begin
Graphic := TJPEGImage.Create;
end;
if Assigned(Graphic) then
begin
try
FS.Seek(0, soFromBeginning);
Graphic.LoadFromStream(FS);
Picture.Assign(Graphic);
except
end;
Graphic.Free;
end;
finally
FS.Free;
end;
end;