[Back to GRAPHICS SWAG index]  [Back to Main SWAG index]  [Original]

{
> I've asked this question before, in several message areas, but
> have still to get an answer.. I need to be able to get the size
> and colors from a JPEG/JFIF image file.. Nothing more, nothing
> less... Structures would do, regardless of language (C, Asm,
> Pas, Basic). Anyone?

Here it is (not fully tested, only extracts height and width of the picture!)
}

Procedure GetJpegInfo(FName : String; VAR IsJpeg: Boolean; VAR Height,
                            Width : Word);

{Checks if file FName is a (true) JPEG/JFIF file and extracts
 height and width (in pixels) of the picture}
Const
  JFIFS : String[4] = #$FF + #$D8 + #$FF + #$E0;
          {JFIF marker: $FF SOI $FF App0}

Var F : File;
    ReadS : String;
    ARead : Word;
    Count : Integer;

begin
   Assign(F,FName);
   Reset(F,1);
   Blockread(F, ReadS[1], 255, Aread);
   ReadS[0] := Chr(Aread);
   Close(F);

   IsJpeg := FALSE;

   {Search for JFIF marker in first 255 bytes of the file.
    If NOT found, then you can safely assume the file isn't
    a (real) JPEG/JFIF file}

   if Pos(JFIFS, ReadS) > 0 then
      begin
      If (Copy(ReadS, Pos(JFIFS,ReadS)+Length(JFIFS)+2,5) = 'JFIF'+#0) then
         begin

         {We have a JPEG/JFIF File!}

         IsJpeg := TRUE;

         {Search for SOF marker}

         Count := 0;
         Repeat
          inc(Count);
         Until (Count > length(ReadS)) OR
               (ReadS[Count] in [#192..#207]);
         if Count <= Length(ReadS) then
            begin
           { ReadS[Count] = first SOF marker
             Count + 1 = length high byte  \ length of APP0 data!
             Count + 2 = length low byte   /
             Count + 3 = data precision    - colors (?)
             Count + 4 = height high byte  \ heigth of picture
             Count + 5 = height low byte   /
             Count + 6 = width high byte   \ width of picture
             Count + 7 = width low byte    /
           }
            Height := Word(Ord(ReadS[Count+4])*256) + Ord(ReadS[Count+5]);
            Width  := Word(Ord(ReadS[Count+6])*256) + ord(ReadS[Count+7]);
            end;
         end;
      end;
end;


[Back to GRAPHICS SWAG index]  [Back to Main SWAG index]  [Original]