I started wih the following, but would like to add more file formats (and make it bulletproof), so help is welcome...
Code: Select all
Procedure.i ImageFileDimension(filename.s,*size.point)
#ImageMinimumSize=16
#ImageHeaderSize=512
Protected Buffer.s
Protected n,m
Protected Ok
If FindString(".png.bmp.jpg.jpeg.gif.","."+LCase(GetExtensionPart(filename))+".")
If FileSize(filename)>#ImageMinimumSize
If ReadFile(0,filename)
Buffer=Space(#ImageHeaderSize)
If ReadData(0,@Buffer,#ImageHeaderSize)
Select PeekL(@Buffer)
Case '8FIG'; GIF
*size\x=PeekW(@Buffer+6)
*size\y=PeekW(@Buffer+8)
Ok=1
Case $E0FFD8FF; JPEG
n=4
Repeat
n+PeekA(@Buffer+n)<<8+PeekA(@Buffer+n+1)
m=PeekW(@Buffer+n)&$FFFF
n+2
If m=$C0FF
Ok=n+3
n=#ImageHeaderSize
ElseIf (m&$FF)<>$FF
n=#ImageHeaderSize
EndIf
Until n>=#ImageHeaderSize
If Ok
*size\x=PeekA(@Buffer+Ok+2)<<8+PeekA(@Buffer+Ok+3)
*size\y=PeekA(@Buffer+Ok+0)<<8+PeekA(@Buffer+Ok+1)
EndIf
Case 'GNP‰'; PNG
*size\x=PeekA(@Buffer+22)<<8+PeekA(@Buffer+23)
*size\y=PeekA(@Buffer+18)<<8+PeekA(@Buffer+19)
Ok=1
Default
If PeekW(@Buffer)='MB'; BMP
*size\x=PeekA(@Buffer+21)<<8+PeekA(@Buffer+22)
*size\y=PeekA(@Buffer+17)<<8+PeekA(@Buffer+18)
Ok=1
EndIf
EndSelect
EndIf
CloseFile(0)
EndIf
EndIf
EndIf
If Ok
ProcedureReturn *size\x<<16+*size\y
Else
ProcedureReturn #Null
EndIf
EndProcedure
x.point
Debug "> "+Hex(ImageFileDimension("0.gif",x))
Debug x\x
Debug x\y