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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
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; |