Mendeteksi tipe Graphic (Image) di dalam Stream

Pada Class TPicture terdapat method seperti LoadFromFile dan SaveToFile, tetapi tidak terdapat method seperti LoadFromStream dan SaveToStream. Bila Class TGraphic pada Class TPicture sudah terbentuk (bisa diakses lewat property Graphic), maka kita bisa menggunakan method LoadFromStream dan SaveToStream yang terdapat pada Class TGraphic tersebut.

Yang mungkin akan menjadi sedikit rumit adalah karena Class TGraphic merupakan Base Class dan turunan Class tersebut bisa bermacam-macam, umumnya tergantung dari tipe image yang ingin ditangani misalnya saja tipe Icon ditangani lewat Class TIcon atau JPEG dengan Class TJPEGImage. Tetapi, kesemuanya itu sudah ditangani oleh Class TPicture menggunakan method LoadFromFile untuk membentuk TGraphic dengan bantuan internal Class TFileFormatsList, yaitu dengan cara mendeteksi ekstensi file yang akan diproses. đŸ˜‰ Bagaimana jika inputnya adalah Stream ?

Bilamana Stream yang dijadikan input proses maka cara yang umumnya digunakan adalah dengan mendeteksi signature/ID (tanda pengenal) yang terdapat pada bagian Header dari struktur tipe image yang akan di proses. Untuk keperluan signature ini kita bisa mencari acuan nilainya di Wotsit’s Format

Berikut ini adalah cuplikan code untuk mendeteksi turunan TGraphic dengan input Stream untuk membaca tanda pengenal pada bagian Header :

Function CreateGraphicClass(Stream: TStream): TGraphic;
Var
  id: Word;
  op: Integer;
Begin
  Result:= Nil;
  If Stream.Size Then Exit;
  op:= Stream.Position;
  Stream.Read(id, SizeOf(id));
  Case id Of
    $0000: Result:= TIcon.Create;
    $4D42: Result:= TBitmap.Create;
    $CDD7: Result:= TMetafile.Create;
    $D8FF: Result:= TJPEGImage.Create;
  End;
  Stream.Position:= op;
End;
Syntax Highlighted with http://delphi-id.org/syntax

Leave a comment