Finding the Dimensions of a Graphic (.bmp, .gif, .png, .jpg)
The four common graphic types are Bitmap (.bmp), Graphics Interchange Format (.gif), Portable Network Graphics (.png), and Joint Photography Experts Group (.jpg). File formats are very specific for each. After identifying the file, it is possible to open that graphics file as a sequential file and extract the width and height (in pixels) of that file.
The Bitmap (.bmp) File
The structure of the bitmap file has been well documented in Liberty BASIC Newsletter Issue #100 and a basic wikispaces Tip. All bitmap files, whether 16, 24, 32, or 256 bitmap format, store the width and height information at bytes 19, 20 and 23, 24.
Filedialog "Open Bitmap","*.bmp", picFile$
Open picFile$ for Input as #pic
pic$=Input$(#pic, LOF(#pic))
Close #pic
picWidth =Asc(Mid$(pic$, 19, 1))+(Asc(Mid$(pic$, 20, 1))*256)
picHeight =Asc(Mid$(pic$, 23, 1))+(Asc(Mid$(pic$, 24, 1))*256)
Print "Bitmap width is ";picWidth
Print "Bitmap height is ";picHeight
End
The Graphics Interface Format (.gif) File
The dimensions of a .gif file are found the same way bitmap dimensions are found. Dimensions of the .gif file are found in bytes 7, 8 and 9, 10. The structure of the .gif file is explained more fully in Viewing Animated GIF Files.
Filedialog "Open GIF","*.gif", picFile$
Open picFile$ for Input as #pic
pic$=Input$(#pic, LOF(#pic))
Close #pic
picWidth =Asc(Mid$(pic$, 7, 1))+(Asc(Mid$(pic$, 8, 1))*256)
picHeight =Asc(Mid$(pic$, 9, 1))+(Asc(Mid$(pic$, 10, 1))*256)
Print "GIF width is ";picWidth
Print "GIF height is ";picHeight
End
The Portable Network Graphics (.png) File
PNG information is stored in chunks. Each chunk is identified by a specific (IHDR) header. To find the dimensions of a .png file, the first IHDR marker must be found. The width and height values are stored in the 7, 8 and 11, 12 bytes following the first chunk beginning with IHDR.
Filedialog "Open PNG","*.png", picFile$
Open picFile$ for Input as #pic
pngInfo$=Input$(#pic, LOF(#pic))
Close #pic
IHDRpos =Instr(pngInfo$, "IHDR")
picWidth =Asc(Mid$(pngInfo$, IHDRpos +7, 1))+(Asc(Mid$(pngInfo$, IHDRpos +6, 1))*256)
picHeight =Asc(Mid$(pngInfo$, IHDRpos +11, 1))+(Asc(Mid$(pngInfo$, IHDRpos +10, 1))*256)
Print "PNG width is ";picWidth,
Print "PNG height is ";picHeight
End
The Joint Photography Experts Group (.jpg, .jpeg) File
As with the .png file, finding the dimensions of a .jpeg file also requires finding a marker. The .jpeg marker is FFC0. Unlike the .png file, though, where only the first marker must be found, the entire .jpeg file must be searched until the last FFC0 marker is found. The width and height information is found in the 5, 6 and 7, 8 bytes following that last FFC0 marker.
Filedialog "Open JPEG","*.jpg;*.jpeg", picFile$
Open picFile$ for Input as #pic
jpgInfo$=Input$(#pic, LOF(#pic))
Close #pic
FFC0$ =Chr$(255);Chr$(192)
FFC0pos =1While FFC0pos >0
FFC0pos =Instr(jpgInfo$, FFC0$)IfAsc(Mid$(jpgInfo$, FFC0pos, 1))=255ThenIfAsc(Mid$(jpgInfo$, FFC0pos +1, 1))=192Then
jpgInfo$ =Mid$(jpgInfo$, FFC0pos +2)EndIfEndIfWend
picWidth =Asc(Mid$(jpgInfo$, FFC0pos +7, 1))+(Asc(Mid$(jpgInfo$, FFC0pos +6, 1))*256)
picHeight =Asc(Mid$(jpgInfo$, FFC0pos +5, 1))+(Asc(Mid$(jpgInfo$, FFC0pos +4, 1))*256)
Print "JPG width is ";picWidth,
Print "JPG height is ";picHeight
End
Finding the File Format
The file extension (e.g., .bmp, .gif, .png, .jpg, .jpeg) usually identifies the file. The file format can also be found within the file information. Bitmaps contain BM in the first 2 bytes, GIF files contain GIF in the first 3 bytes, PNG files contain PNG in the 2nd, 3rd, and 4th bytes, and JPEG files contain JFIF in the 7th, 8th, 9th, and 10th files. Open the file as a sequential file to identify the file format.
Filedialog "Open Graphic File","*.*", picFile$
Open picFile$ for Input as #pic
pic$=Input$(#pic, LOF(#pic))
Close #pic
ID$ =Left$(pic$, 10)SelectCaseCaseLeft$(pic$, 2)="BM"
graphicFormat$ ="BMP"CaseLeft$(pic$, 3)="GIF"
graphicFormat$ ="GIF"CaseMid$(pic$, 2, 3)="PNG"
graphicFormat$ ="PNG"CaseMid$(pic$, 7, 4)="JFIF"
graphicFormat$ ="JPEG"CaseElse
graphicFormat$ ="Unknown"EndSelect
Print "Graphic Format = ";graphicFormat$
End
A Function to Obtain the Dimensions of a Graphic
Combining the separate format string parsings into one function makes an easy snippet to obtain the dimensions of any of the four common graphic formats.
Finding the Dimensions of a Graphic (.bmp, .gif, .png, .jpg)
The four common graphic types are Bitmap (.bmp), Graphics Interchange Format (.gif), Portable Network Graphics (.png), and Joint Photography Experts Group (.jpg). File formats are very specific for each. After identifying the file, it is possible to open that graphics file as a sequential file and extract the width and height (in pixels) of that file.
The Bitmap (.bmp) File
The structure of the bitmap file has been well documented in Liberty BASIC Newsletter Issue #100 and a basic wikispaces Tip. All bitmap files, whether 16, 24, 32, or 256 bitmap format, store the width and height information at bytes 19, 20 and 23, 24.The Graphics Interface Format (.gif) File
The dimensions of a .gif file are found the same way bitmap dimensions are found. Dimensions of the .gif file are found in bytes 7, 8 and 9, 10. The structure of the .gif file is explained more fully in Viewing Animated GIF Files.The Portable Network Graphics (.png) File
PNG information is stored in chunks. Each chunk is identified by a specific (IHDR) header. To find the dimensions of a .png file, the first IHDR marker must be found. The width and height values are stored in the 7, 8 and 11, 12 bytes following the first chunk beginning with IHDR.The Joint Photography Experts Group (.jpg, .jpeg) File
As with the .png file, finding the dimensions of a .jpeg file also requires finding a marker. The .jpeg marker is FFC0. Unlike the .png file, though, where only the first marker must be found, the entire .jpeg file must be searched until the last FFC0 marker is found. The width and height information is found in the 5, 6 and 7, 8 bytes following that last FFC0 marker.Finding the File Format
The file extension (e.g., .bmp, .gif, .png, .jpg, .jpeg) usually identifies the file. The file format can also be found within the file information. Bitmaps contain BM in the first 2 bytes, GIF files contain GIF in the first 3 bytes, PNG files contain PNG in the 2nd, 3rd, and 4th bytes, and JPEG files contain JFIF in the 7th, 8th, 9th, and 10th files. Open the file as a sequential file to identify the file format.A Function to Obtain the Dimensions of a Graphic
Combining the separate format string parsings into one function makes an easy snippet to obtain the dimensions of any of the four common graphic formats.Filedialog, "Open Graphic File", "*.bmp;*.gif;*.png;*.jpg;*.jpeg", picFile$ graphicFormat$ = GraphicFormat$(picFile$) Print "GraphicFormat = ";graphicFormat$;"." If graphicFormat$ = "Unknown" Then Print "Unable to continue." End End If graphicDimen$ =GraphicDimensions$(picFile$, graphicFormat$) graphicWidth = Val(Word$(graphicDimen$, 1, "|")) graphicHeight = Val(Word$(graphicDimen$, 2, "|")) Print "Graphic Width = ";graphicWidth Print "Graphic Height = ";graphicHeight End Function GraphicDimensions$(picFile$, graphicFormat$) Open picFile$ for Input as #pic pic$ = Input$(#pic, LOF(#pic)) Close #pic Select Case graphicFormat$ Case "BMP" picWidth = Asc(Mid$(pic$, 19, 1)) + (Asc(Mid$(pic$, 20, 1)) * 256) picHeight = Asc(Mid$(pic$, 23, 1)) + (Asc(Mid$(pic$, 24, 1)) * 256) Case "GIF" picWidth = Asc(Mid$(pic$, 7, 1)) + (Asc(Mid$(pic$, 8, 1)) * 256) picHeight = Asc(Mid$(pic$, 9, 1)) + (Asc(Mid$(pic$, 10, 1)) * 256) Case "PNG" IHDRpos = Instr(pic$, "IHDR") picWidth = Asc(Mid$(pic$, IHDRpos + 7, 1)) + (Asc(Mid$(pic$, IHDRpos + 6, 1)) * 256) picHeight = Asc(Mid$(pic$, IHDRpos + 11, 1)) + (Asc(Mid$(pic$, IHDRpos + 10, 1)) * 256) Case "JPEG" FFC0$ = Chr$(255);Chr$(192) FFC0pos = 1 While FFC0pos > 0 FFC0pos = Instr(pic$, FFC0$) If Asc(Mid$(pic$, FFC0pos, 1)) = 255 Then If Asc(Mid$(pic$, FFC0pos + 1, 1)) = 192 Then pic$ = Mid$(pic$, FFC0pos + 2) End If End If Wend picWidth = Asc(Mid$(pic$, FFC0pos + 7, 1)) + (Asc(Mid$(pic$, FFC0pos + 6, 1)) * 256) picHeight = Asc(Mid$(pic$, FFC0pos + 5, 1)) + (Asc(Mid$(pic$, FFC0pos + 4, 1)) * 256) Case Else picWidth = 0 picHeight = 0 End Select GraphicDimensions$ = Str$(picWidth);"|";Str$(picHeight) End Function Function GraphicFormat$(picFile$) Open picFile$ for Input as #pic pic$=Input$(#pic, LOF(#pic)) Close #pic ID$ = Left$(pic$, 10) Select Case Case Left$(pic$, 2) = "BM" GraphicFormat$ = "BMP" Case Left$(pic$, 3) = "GIF" GraphicFormat$ = "GIF" Case Mid$(pic$, 2, 3) = "PNG" GraphicFormat$ = "PNG" Case Mid$(pic$, 7, 4) = "JFIF" GraphicFormat$ = "JPEG" Case Else GraphicFormat$ = "Unknown" End Select End Function