Mega Code Archive

 
Categories / Delphi / Files
 

Get width and height of a GIF image file

Title: Get width and height of a GIF image file function ReadMWord(f: TFileStream): Word; type TMotorolaWord = record case Byte of 0: (Value: Word); 1: (Byte1, Byte2: Byte); end; var MW: TMotorolaWord; begin f.read(MW.Byte2, SizeOf(Byte)); f.read(MW.Byte1, SizeOf(Byte)); Result := MW.Value; end; procedure GetGIFSize(const sGIFFile: string; var wWidth, wHeight: Word); type TGIFHeader = record Sig: array[0..5] of char; ScreenWidth, ScreenHeight: Word; Flags, Background, Aspect: Byte; end; TGIFImageBlock = record Left, Top, Width, Height: Word; Flags: Byte; end; var f: file; Header: TGifHeader; ImageBlock: TGifImageBlock; nResult: integer; x: integer; c: char; DimensionsFound: boolean; begin wWidth := 0; wHeight := 0; if sGifFile = '' then Exit; {$I-} FileMode := 0; { read-only } AssignFile(f, sGifFile); reset(f, 1); if IOResult 0 then { Could not open file } Exit; { Read header and ensure valid file. } BlockRead(f, Header, SizeOf(TGifHeader), nResult); if (nResult SizeOf(TGifHeader)) or (IOResult 0) or (StrLComp('GIF', Header.Sig, 3) 0) then begin { Image file invalid } Close(f); Exit; end; { Skip color map, if there is one } if (Header.Flags and $80) 0 then begin x := 3 * (1 shl ((Header.Flags and 7) + 1)); Seek(f, x); if IOResult 0 then begin { Color map thrashed } Close(f); Exit; end; end; DimensionsFound := False; FillChar(ImageBlock, SizeOf(TGIFImageBlock), #0); { Step through blocks. } BlockRead(f, c, 1, nResult); while (not EOF(f)) and (not DimensionsFound) do begin case c of ',': { Found image } begin BlockRead(f, ImageBlock, SizeOf(TGIFImageBlock), nResult); if nResult SizeOf(TGIFImageBlock) then begin { Invalid image block encountered } Close(f); Exit; end; wWidth := ImageBlock.Width; wHeight := ImageBlock.Height; DimensionsFound := True; end; '?': { Skip } begin { NOP } end; { nothing else. just ignore } end; BlockRead(f, c, 1, nResult); end; Close(f); {$I+} end; Example usage: var width,height:word; begin GetGIFSize(filename,width, height); end;