Converted the source code into "Wilbert-style" - supports BMP, GIF, JPEG, JPEG2000, PCX, PNG, TGA, TIF images.
Code: Select all
Structure ImageSizeType
Width.l
Height.l
EndStructure
Procedure.l CheckImageName(*Name)
!xor eax, eax
!xor ecx, ecx
CompilerIf #PB_Compiler_Processor=#PB_Processor_x64
!mov rdx, [p.p_Name]
!iiname_loop:
!shrd eax, ecx, 8
CompilerIf #PB_Compiler_Unicode
!mov cx, [rdx]
!add rdx, 2
CompilerElse
!movzx cx, byte [rdx]
!inc rdx
CompilerEndIf
CompilerElse
!mov edx, [p.p_Name]
!iiname_loop:
!shrd eax, ecx, 8
CompilerIf #PB_Compiler_Unicode
!mov cx, [edx]
!add edx, 2
CompilerElse
!movzx cx, byte [edx]
!inc edx
CompilerEndIf
CompilerEndIf
!test cx, cx
!jnz iiname_loop
!or eax, 0x20202020
!cmp eax, '.bmp'
!je iiname_exit
!cmp eax, '.gif'
!je iiname_exit
!cmp eax, '.jp2'
!je iiname_exit
!cmp eax, '.jpg'
!je iiname_exit
!cmp eax, '.pcx'
!je iiname_exit
!cmp eax, '.png'
!je iiname_exit
!cmp eax, 'jpeg'
!je iiname_exit
!cmp eax, '.tif'
!je iiname_exit
!cmp eax, '.tga'
!je iiname_exit
!xor eax, eax
!iiname_exit:
ProcedureReturn
EndProcedure
Procedure ImageFileDimension(filename.s,*imagesize.ImageSizeType)
#ImageMinimumSize= 24
#ImageHeaderSize= 2048
#ImageHeaderGIF= $38464947; 'GIF8'
#ImageHeaderJPG= $E0FFD8FF; -
#ImageHeaderJP2= $0C000000; -
#ImageHeaderPNG= $474E5089; '‰PNG'
#ImageHeaderBMP= $4D42; 'BM'
#ImageHeaderTIF_LSB= $4949; 'II'
#ImageHeaderTIF_MSB= $4D4D; 'MM'
#ImageHeaderPCX= $0A; -
#ImageHeaderTGA= $01; -
Structure MemArray
StructureUnion
a.a[0]
w.w[0]
l.l[0]
EndStructureUnion
EndStructure
Protected *Buffer.MemArray
Protected *MemArray.MemArray
Protected BytesRead.i
Protected a.a,n.l,m
#ImageFile=666
*imagesize\width=#Null
*imagesize\height=#Null
If CheckImageName(@FileName)
If ReadFile(#ImageFile,FileName, #PB_File_NoBuffering)
*Buffer=AllocateMemory(#ImageHeaderSize,#PB_Memory_NoClear)
BytesRead=ReadData(#ImageFile,*Buffer,#ImageHeaderSize)
If BytesRead>=#ImageMinimumSize
Select *Buffer\l[0]&$FFFFFFFF
Case #ImageHeaderJPG
n=*Buffer\a[4]<< 8|*Buffer\a[5]+4
If n>20
FileSeek(0,n)
BytesRead=ReadData(#ImageFile,*Buffer,#ImageHeaderSize)
n=0
EndIf
*MemArray=*Buffer+n
While *MemArray-*Buffer+6<BytesRead
If *MemArray\a[0]=$FF
a=*MemArray\a[1]
If a=$c0 Or (a>>4=$C And a&3)
*imagesize\width=*MemArray\a[7]<<8|*MemArray\a[8]
*imagesize\height=*MemArray\a[5]<<8|*MemArray\a[6]
Break
EndIf
Else
Break
EndIf
*MemArray+*MemArray\a[2]<<8|*MemArray\a[3]+2
Wend
Case #ImageHeaderPNG
*imagesize\width=*Buffer\a[18]<<8|*Buffer\a[19]
*imagesize\height=*Buffer\a[22]<<8|*Buffer\a[23]
Case #ImageHeaderGIF
*imagesize\width=*Buffer\w[3]
*imagesize\height=*Buffer\w[4]
Case #ImageHeaderJP2
n=*Buffer\a[14]<<8|*Buffer\a[15]+35
If n<#ImageHeaderSize
*imagesize\width=*Buffer\a[n-1]<<8|*Buffer\a[n]
*imagesize\height=*Buffer\a[n-5]<<8|*Buffer\a[n-4]
EndIf
Default
Select *Buffer\w[0]&$FFFF
Case #ImageHeaderBMP
*imagesize\width=*Buffer\w[9]
n=*Buffer\w[11]&$FFFF
If n<0
n=-n
EndIf
*imagesize\height=n
Case #ImageHeaderTIF_LSB
a=0
n=*Buffer\l[1]
If n<#ImageHeaderSize
n>>1
m=*Buffer\w[n]
n+1
While m
Select *Buffer\w[n]
Case $100
*imagesize\width=*Buffer\w[n+4]
a|1
Case $101
*imagesize\height=*Buffer\w[n+4]
a|2
EndSelect
If a=3
m=0
Else
n+6
m-1
EndIf
Wend
EndIf
Case #ImageHeaderTIF_MSB
a=0
n=*Buffer\a[6]<<8|*Buffer\a[7]
If n<#ImageHeaderSize
m=*Buffer\a[n]<<8|*Buffer\a[n+1]
n+2
While m
Select *Buffer\a[n]<<8|*Buffer\a[n+1]
Case $100
*imagesize\width=*Buffer\a[n+8]<<8|*Buffer\a[n+9]
a|1
Case $101
*imagesize\height=*Buffer\a[n+8]<<8|*Buffer\a[n+9]
a|2
EndSelect
If a=3
m=0
Else
n+12
m-1
EndIf
Wend
EndIf
Default
Select *Buffer\a[0]
Case #ImageHeaderPCX
If *Buffer\a[1]<6
*imagesize\width=*Buffer\w[4]+1
*imagesize\height=*Buffer\w[5]+1
EndIf
Case #ImageHeaderTGA
If *Buffer\a[1]<2 And *Buffer\a[2]&%11110100=0
*imagesize\width=*Buffer\w[6]
*imagesize\height=*Buffer\w[7]
EndIf
EndSelect
EndSelect
EndSelect
EndIf
FreeMemory(*Buffer)
CloseFile(#ImageFile)
EndIf
EndIf
Debug "------ "+GetFilePart(filename)+" ------"
Debug Str(*imagesize\Width)+" x "+Str(*imagesize\Height)
EndProcedure
x.ImageSizeType
ImageFileDimension("Data\PB.gif",x)
ImageFileDimension("Data\LSB.tif",x)
ImageFileDimension("Data\MSB.tif",x)
ImageFileDimension("Data\Willi.jpg",x)
ImageFileDimension("Data\Logo.jp2",x)
ImageFileDimension("Data\Bird.png",x)
ImageFileDimension("Data\Logo.bmp",x)
ImageFileDimension("Data\Bert.bmp",x)
ImageFileDimension("Data\Logo.pcx",x)
ImageFileDimension("Data\Logo.tga",x)