This module analyzes JPEG/JPEG 2000/PNG/GIF/TIFF/SVG/Netpbm/WebP/BMP/AVIF/HEIC/HEIF image headers and returns image size, DPI, and related metadata.
import imagesize width, height = imagesize.get("test.png") print(width, height) xdpi, ydpi = imagesize.getDPI("test.png") print(xdpi, ydpi) info = imagesize.get_info("test.png") print(info.width, info.height, info.rotation, info.xdpi, info.ydpi, info.colors, info.channels)This module is a pure Python module. You can use file like object like file or something like io.BytesIO.
Supported Python versions: 3.10-3.14
pip install imagesizeFor local development setup:
python -m venv .venv source .venv/bin/activate pip install -e .Version 2.0 includes the following updates:
- Added/expanded support for
BMP. - Added support for
AVIF. - Added support for
HEIC/HEIF. imagesize.get_info()now returns richer metadata including color depth, channel count, and rotation information.- Improved EXIF orientation handling so JPEG, TIFF, AVIF, and HEIC/HEIF return sizes that correctly reflect EXIF rotation metadata.
- Added type hints for the public API and related input/output types.
Backward incompatible behavior in 2.0:
imagesize.get()now returns(-1, -1)when parsing fails.imagesize.getDPI()now returns(-1, -1)when parsing fails.
If your existing code relied on exceptions during parse failures, update it to explicitly check return values.
imagesize.get(filepath: FileInput, *, exif_rotation: bool = True) -> tuple[int, int]Returns image size as
(width, height). By default, orientation metadata is applied for rotated JPEG/TIFF images; passexif_rotation=Falseto get the stored size as-is. On parsing errors it returns(-1, -1).imagesize.getDPI(filepath: FileInput) -> tuple[int, int]Returns image DPI as
(xdpi, ydpi). On parsing errors it returns(-1, -1).imagesize.get_info(filepath: FileInput, *, size: bool = True, dpi: bool = True, colors: bool = True, exif_rotation: bool = True, channels: bool = True) -> ImageInfoReturns an
ImageInfonamed tuple withwidth,height,rotation,xdpi,ydpi,colorsandchannelsfields.rotationcontains orientation metadata (e.g. EXIF Orientation tag, or-1when unavailable).
It only parses headers, and ignores pixel data. So it is much faster than Pillow.
| module | result |
|---|---|
| imagesize (pure Python) | 1.077 seconds per 100 000 times |
| Pillow | 10.569 seconds per 100 000 times |
I tested on MacBookPro (2014/Core i7) with 125kB PNG files.
Run test with the following command:
python -m unittestMIT License
- test/images/test.heic: https://nokiatech.github.io/heif/examples.html
- test/images/test.avif: https://libre-software.net/image/avif-test/
I referred to the following code:
- http://markasread.net/post/17551554979/get-image-size-info-using-pure-python-code
- https://stackoverflow.com/questions/8032642/how-to-obtain-image-size-using-standard-python-class-without-using-external-lib
I use sample image from here:
Thank you for feedback:
- tk0miya (https://github.com/tk0miya)
- shimizukawa (https://github.com/shimizukawa)
- xantares (https://github.com/xantares)
- Ivan Zakharyaschev (https://github.com/imz)
- Jon Dufresne (https://github.com/jdufresne)
- Geoff Lankow (https://github.com/darktrojan)
- Hugo (https://github.com/hugovk)
- Jack Cherng (https://github.com/jfcherng)
- Tyler A. Young (https://github.com/s3cur3)
- Mark Browning (https://github.com/mabrowning)
- ossdev07 (https://github.com/ossdev07)
- Nicholas-Schaub (https://github.com/Nicholas-Schaub)
- Nuffknacker (https://github.com/Nuffknacker)
- Hannes Römer (https://github.com/hroemer)
- mikey (https://github.com/ffreemt)
- Marco (https://github.com/marcoffee)
- ExtReMLapin (https://github.com/ExtReMLapin)
- gremur (https://github.com/gremur)
- fuyb1992 (https://github.com/fuyb1992)
- flagman (https://github.com/flagman)