Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to obtain image size using standard Python class (without using external library)?

I am using Python 2.5. And using the standard classes from Python, I want to determine the image size of a file.

I've heard PIL (Python Image Library), but it requires installation to work.

How might I obtain an image's size without using any external library, just using Python 2.5's own modules?

Note I want to support common image formats, particularly JPG and PNG.

like image 754
eros Avatar asked Nov 07 '11 04:11

eros


People also ask

How do I get the size of an image in Python?

open() is used to open the image and then . width and . height property of Image are used to get the height and width of the image.


1 Answers

Here's a python 3 script that returns a tuple containing an image height and width for .png, .gif and .jpeg without using any external libraries (ie what Kurt McKee referenced above). Should be relatively easy to transfer it to Python 2.

import struct import imghdr  def get_image_size(fname):     '''Determine the image type of fhandle and return its size.     from draco'''     with open(fname, 'rb') as fhandle:         head = fhandle.read(24)         if len(head) != 24:             return         if imghdr.what(fname) == 'png':             check = struct.unpack('>i', head[4:8])[0]             if check != 0x0d0a1a0a:                 return             width, height = struct.unpack('>ii', head[16:24])         elif imghdr.what(fname) == 'gif':             width, height = struct.unpack('<HH', head[6:10])         elif imghdr.what(fname) == 'jpeg':             try:                 fhandle.seek(0) # Read 0xff next                 size = 2                 ftype = 0                 while not 0xc0 <= ftype <= 0xcf:                     fhandle.seek(size, 1)                     byte = fhandle.read(1)                     while ord(byte) == 0xff:                         byte = fhandle.read(1)                     ftype = ord(byte)                     size = struct.unpack('>H', fhandle.read(2))[0] - 2                 # We are at a SOFn block                 fhandle.seek(1, 1)  # Skip `precision' byte.                 height, width = struct.unpack('>HH', fhandle.read(4))             except Exception: #IGNORE:W0703                 return         else:             return         return width, height 
like image 117
Fred the Fantastic Avatar answered Sep 16 '22 22:09

Fred the Fantastic