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.15
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/AVIF/HEIF 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).
HTTP and HTTPS URLs are accepted as input. The library uses HTTP byte-range requests automatically so that pixel data does not need to be downloaded. If a server does not support range requests, it transparently falls back to one full download for compatibility. The first request is limited to 8 KiB; later random access expands cached regions in 64 KiB blocks only when more metadata is needed.
Only headers and the metadata needed for the requested result are read. Pixel
payloads are skipped with seek() locally and HTTP Range requests remotely.
Run the included benchmark with:
python bench.py --number 10000The report includes elapsed time and the number of bytes read for PNG, JPEG, TIFF, GIF, JPEG2000, AVIF, and HEIF. It also simulates an 8 MiB remote AVIF and reports the number of Range requests and transferred bytes.
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://latimes.pages.dev/https-github.com/tk0miya)
- shimizukawa (https://latimes.pages.dev/https-github.com/shimizukawa)
- xantares (https://latimes.pages.dev/https-github.com/xantares)
- Ivan Zakharyaschev (https://latimes.pages.dev/https-github.com/imz)
- Jon Dufresne (https://latimes.pages.dev/https-github.com/jdufresne)
- Geoff Lankow (https://latimes.pages.dev/https-github.com/darktrojan)
- Hugo (https://latimes.pages.dev/https-github.com/hugovk)
- Jack Cherng (https://latimes.pages.dev/https-github.com/jfcherng)
- Tyler A. Young (https://latimes.pages.dev/https-github.com/s3cur3)
- Mark Browning (https://latimes.pages.dev/https-github.com/mabrowning)
- ossdev07 (https://latimes.pages.dev/https-github.com/ossdev07)
- Nicholas-Schaub (https://latimes.pages.dev/https-github.com/Nicholas-Schaub)
- Nuffknacker (https://latimes.pages.dev/https-github.com/Nuffknacker)
- Hannes Römer (https://latimes.pages.dev/https-github.com/hroemer)
- mikey (https://latimes.pages.dev/https-github.com/ffreemt)
- Marco (https://latimes.pages.dev/https-github.com/marcoffee)
- ExtReMLapin (https://latimes.pages.dev/https-github.com/ExtReMLapin)
- gremur (https://latimes.pages.dev/https-github.com/gremur)
- fuyb1992 (https://latimes.pages.dev/https-github.com/fuyb1992)
- flagman (https://latimes.pages.dev/https-github.com/flagman)
- icemac (https://latimes.pages.dev/https-github.com/icemac)
- ojuuji (https://latimes.pages.dev/https-github.com/ojuuji)
- stephenfin (https://latimes.pages.dev/https-github.com/stephenfin)
- gaoflow (https://latimes.pages.dev/https-github.com/gaoflow)
- jdillard (https://latimes.pages.dev/https-github.com/jdillard)