Skip to main content

imagesize

https://github.com/shibukawa/imagesize_py/actions/workflows/ci.yml/badge.svg PyPI version Supported Python versions License

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

Installation

pip install imagesize

For local development setup:

python -m venv .venv
source .venv/bin/activate
pip install -e .

Version 2.0 migration notes

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.

API

  • 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; pass exif_rotation=False to 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) -> ImageInfo

    Returns an ImageInfo named tuple with width, height, rotation, xdpi, ydpi, colors and channels fields. rotation contains orientation metadata (e.g. EXIF Orientation tag, or -1 when 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.

Benchmark

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 10000

The 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.

Development

Run test with the following command:

python -m unittest

License

MIT License

Thanks

I referred to the following code:

I use sample image from here:

Thank you for feedback:

Release files for imagesize 2.0.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for imagesize 2.0.1
File Size Uploaded
imagesize-2.0.1.tar.gz 1.9 MB Details

Built distribution (wheel)

Table of built distributions (wheels) for imagesize 2.0.1
File Interpreter ABI Platform
imagesize-2.0.1-py3-none-any.whl Python 3 none any Details

Total release size: 1.9 MB

Release files / imagesize-2.0.1.tar.gz

Download URL imagesize-2.0.1.tar.gz
Size 1.9 MB
Tags Source
SHA-256 checksum
How to use checksums
b2ba6a4dea487a7ebcd53248d3476aca449d30db12a2dde5e0c5ca9624fd77e5
BLAKE2b-256 checksum
How to use checksums
fb5e513ff06670c84e7b9887c1fdf61b2d42b4f574a831f2f1d2222023049d8a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.0

Release files / imagesize-2.0.1-py3-none-any.whl

Download URL imagesize-2.0.1-py3-none-any.whl
Size 14.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
ea0c9a0384df69ed86a943a15cde37d0360b82491b3910dc2215e202e62b5b02
BLAKE2b-256 checksum
How to use checksums
01f9575c8d760eae1fc99651b7cc5efd96ad5379ca4d6b53750b0fb4fe983f34
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.0

Release history Release notifications | RSS feed

This release

2.0.1 This release

2 release files

2.0.0

2 release files

1.5.0

2 release files

1.4.1

2 release files

1.4.0

3 release files

1.3.0

2 release files

1.2.0

2 release files

1.1.0

2 release files

1.0.0

2 release files

0.7.1

2 release files

0.7.0

2 release files

0.6.0

2 release files

0.5.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page