A function to read the dimensions of image files (supports BMP, PNG, and DDS) without having to actually load the image into memory. Comes with example code.
Language:
Dark Basic Pro
Code:
` File number constant #constant IMAGEINFOFILE 1 ` Globals to store dimensions global IMAGEWIDTH as dword global IMAGEHEIGHT as dword global IMAGEDEPTH as word GetImageFileDimensions("image.bmp") print "image.bmp details: "+str$(IMAGEWIDTH)+"x"+str$(IMAGEHEIGHT)+" "+str$(IMAGEDEPTH)+"-bit" GetImageFileDimensions("image.png") print "image.png details: "+str$(IMAGEWIDTH)+"x"+str$(IMAGEHEIGHT)+" "+str$(IMAGEDEPTH)+"-bit" GetImageFileDimensions("image.dds") print "image.dds details: "+str$(IMAGEWIDTH)+"x"+str$(IMAGEHEIGHT)+" "+str$(IMAGEDEPTH)+"-bit" wait key end function GetImageFileDimensions(fileName as string) local bitDepth as byte local colorType as byte local tempVar as integer fileExt$ = lower$(right$(fileName, 4)) select fileExt$ ` .BMP case ".bmp" open to read IMAGEINFOFILE, fileName ` Check for BMP signature read word IMAGEINFOFILE, tempVar if tempVar <> 19778 then goto GetImageFileDimensions_Error ` Read dimensions skip bytes IMAGEINFOFILE, 16 read long IMAGEINFOFILE, IMAGEWIDTH read long IMAGEINFOFILE, IMAGEHEIGHT skip bytes IMAGEINFOFILE, 2 read word IMAGEINFOFILE, IMAGEDEPTH close file IMAGEINFOFILE endcase ` .PNG case ".png" open to read IMAGEINFOFILE, fileName ` Check for PNG signature read long IMAGEINFOFILE, tempVar read long IMAGEINFOFILE, tempVar2 if tempVar <> 0x474e5089 or tempVar2 <> 0xa1a0a0d then goto GetImageFileDimensions_Error ` Read dimensions skip bytes IMAGEINFOFILE, 8 read long IMAGEINFOFILE, tempVar IMAGEWIDTH = ConvertEndian(tempVar) read long IMAGEINFOFILE, tempVar IMAGEHEIGHT = ConvertEndian(tempVar) ` Calculate depth read byte IMAGEINFOFILE, bitDepth read byte IMAGEINFOFILE, colorType select colorType case 2 IMAGEDEPTH = bitDepth * 3 endcase case 4 IMAGEDEPTH = bitDepth * 2 endcase case 6 IMAGEDEPTH = bitDepth * 4 endcase case default IMAGEDEPTH = bitDepth endcase endselect close file IMAGEINFOFILE endcase ` .DDS (Doesn't return bit depth of compressed files) case ".dds" open to read IMAGEINFOFILE, fileName ` Check for DDS signature read long IMAGEINFOFILE, tempVar if tempVar <> 0x20534444 then goto GetImageFileDimensions_Error ` Read dimensions skip bytes IMAGEINFOFILE, 8 read long IMAGEINFOFILE, IMAGEHEIGHT read long IMAGEINFOFILE, IMAGEWIDTH ` Read depth if possible skip bytes IMAGEINFOFILE, 60 read long IMAGEINFOFILE, tempVar if tempVar && 0x00000040 skip bytes IMAGEINFOFILE, 4 read long IMAGEINFOFILE, tempVar IMAGEDEPTH = tempVar else IMAGEDEPTH = 0 endif close file IMAGEINFOFILE endcase ` Unsupported file format case default exit prompt "GetImageFileDimensions", "File format not supported" end endcase endselect exitfunction 1 GetImageFileDimensions_Error: IMAGEWIDTH = 0 IMAGEHEIGHT = 0 IMAGEDEPTH = 0 close file IMAGEINFOFILE endfunction 0 function ConvertEndian(value as dword) ` Required to convert some PNG format values result = ((value && 0xFF) << 24) || ((value && 0xFF00) << 8) || ((value && 0xFF0000) >> 8) || ((value && 0xFF000000) >> 24) endfunction result
(3 votes)
Sat, 11/24/2007 - 11:03
That is a nifty little function! Thanks Benjamin!
Tue, 11/27/2007 - 10:17
Thanks, glad you like it.