|pypi| |python-badge| |django-badge| |docs| |gh-actions| |codecov| |precommit| ============== sorl-thumbnail ============== Thumbnails for Django. You write the size in the template, or ask for it in Python, and sorl-thumbnail makes the thumbnail on first use with Pillow, libvips or ImageMagick, saves it on your media storage and remembers it in a key-value store, so later renders cost no image work and no storage request. - Website, with an example gallery for every image engine: https://mariocesar.github.io/sorl-thumbnail/ - Documentation: https://sorl-thumbnail.readthedocs.io/ Quick start =========== Install sorl-thumbnail with Pillow:: pip install "sorl-thumbnail[pil]" Add ``'sorl.thumbnail'`` to ``INSTALLED_APPS``:: INSTALLED_APPS = [ ... 'sorl.thumbnail', ] and create its table:: python manage.py migrate Then, in a template:: {% load thumbnail %} {% thumbnail item.image "100x100" crop="center" as im %} {% endthumbnail %} ``item.image`` can be an ``ImageField``, a path in your media storage or the URL of an image. The same from Python:: from sorl.thumbnail import get_thumbnail im = get_thumbnail(item.image, '100x100', crop='center', quality=99) The `quickstart`_ walks through this. The documentation covers the `template tag and its options`_, every `setting`_, `thumbnails on Amazon S3`_ and `troubleshooting`_. Features ======== - Resize to a box, a width or a height. Crop by position, percentage, pixels or a crop box, crop to the busiest part of the image, or cut plain borders first. - JPEG, PNG, GIF, WEBP and AVIF output, with quality, progressive JPEG, grayscale, padding, rounded corners and blur. Animated GIFs stay animated with Pillow and libvips. - Follows the EXIF orientation of photos. - Any Django storage for sources and thumbnails, Amazon S3 included. The key-value store, your database read through your cache or Redis, remembers every thumbnail, so a cached one costs no storage request. - An ``ImageField`` that validates uploads, an admin widget with a preview, and placeholder images for developing without the real media. - Alternative resolutions for high-density screens, and the ``is_portrait`` and ``margin`` filters for layout. - Django 5.2, 6.0 and 6.1, following the `Django supported versions policy`_, on Python 3.10 and later. Engines ======= The engine does the resizing. Set it with ``THUMBNAIL_ENGINE``; Pillow is the default. - `Pillow`_, the default: ``pip install "sorl-thumbnail[pil]"``. - `libvips`_ through pyvips: ``pip install "sorl-thumbnail[vips]"``. - `ImageMagick`_, through its ``convert`` and ``identify`` commands. Also reads PDF pages. - `GraphicsMagick`_, the same engine through ``gm convert`` and ``gm identify``. - `Wand`_, a Python binding for ImageMagick: ``pip install "sorl-thumbnail[wand]"``. - `pgmagick`_, a Python binding for GraphicsMagick: ``pip install "sorl-thumbnail[pgmagick]"``. Each engine has an example gallery on the `website`_, and the documentation lists which options each one supports. Using it next to another thumbnail library ========================================== Other libraries also register a ``thumbnail`` template library. Load sorl-thumbnail's tags as ``sorl_thumbnail`` instead, the tag is the same:: {% load sorl_thumbnail %} Help ==== Ask in the Q&A category of `GitHub Discussions`_. Report bugs in the `issue tracker`_. Contributing ============ Pull requests are welcome. The `contributing guide`_ explains how to run the tests and send a change. Using AI tools is fine if you say so and test the change yourself; pull requests sent by scripts are closed. By contributing you agree to the `Code of Conduct`_. To report a security issue, follow the `security policy`_ instead of opening a public issue. The tests run with tox through `uv`_, one environment per Python, Django and engine:: uvx --with tox-uv tox -l uvx --with tox-uv tox -e py312-django52-pil The Pillow and libvips environments need nothing else. The others need the engine's tools, see the `requirements`_, or run them in Docker as the contributing guide shows. License ======= BSD 3-Clause, see the `LICENSE file `_. .. |gh-actions| image:: https://github.com/mariocesar/sorl-thumbnail/actions/workflows/test.yml/badge.svg :target: https://github.com/mariocesar/sorl-thumbnail/actions/workflows/test.yml :alt: Test status .. |docs| image:: https://readthedocs.org/projects/sorl-thumbnail/badge/?version=latest :target: https://sorl-thumbnail.readthedocs.io/en/latest/ :alt: Documentation for the latest version .. |pypi| image:: https://img.shields.io/pypi/v/sorl-thumbnail.svg :target: https://pypi.org/project/sorl-thumbnail/ :alt: sorl-thumbnail on PyPI .. |python-badge| image:: https://img.shields.io/pypi/pyversions/sorl-thumbnail.svg :target: https://pypi.org/project/sorl-thumbnail/ :alt: Supported Python versions .. |django-badge| image:: https://img.shields.io/pypi/djversions/sorl-thumbnail.svg :target: https://pypi.org/project/sorl-thumbnail/ :alt: Supported Django versions .. |codecov| image:: https://codecov.io/gh/mariocesar/sorl-thumbnail/graph/badge.svg :target: https://codecov.io/gh/mariocesar/sorl-thumbnail :alt: Test coverage .. |precommit| image:: https://results.pre-commit.ci/badge/github/mariocesar/sorl-thumbnail/main.svg :target: https://results.pre-commit.ci/latest/github/mariocesar/sorl-thumbnail/main :alt: pre-commit.ci status .. _Pillow: https://pillow.readthedocs.io/ .. _libvips: https://www.libvips.org/ .. _ImageMagick: https://imagemagick.org/ .. _GraphicsMagick: http://www.graphicsmagick.org/ .. _Wand: https://docs.wand-py.org/ .. _pgmagick: https://pgmagick.readthedocs.io/ .. _uv: https://docs.astral.sh/uv/ .. _website: https://mariocesar.github.io/sorl-thumbnail/ .. _quickstart: https://sorl-thumbnail.readthedocs.io/en/latest/quickstart.html .. _template tag and its options: https://sorl-thumbnail.readthedocs.io/en/latest/template.html .. _setting: https://sorl-thumbnail.readthedocs.io/en/latest/reference/settings.html .. _thumbnails on Amazon S3: https://sorl-thumbnail.readthedocs.io/en/latest/s3.html .. _troubleshooting: https://sorl-thumbnail.readthedocs.io/en/latest/troubleshooting.html .. _requirements: https://sorl-thumbnail.readthedocs.io/en/latest/requirements.html .. _contributing guide: https://sorl-thumbnail.readthedocs.io/en/latest/contributing.html .. _Django supported versions policy: https://www.djangoproject.com/download/#supported-versions .. _GitHub Discussions: https://github.com/mariocesar/sorl-thumbnail/discussions .. _issue tracker: https://github.com/mariocesar/sorl-thumbnail/issues .. _Code of Conduct: https://github.com/mariocesar/sorl-thumbnail/blob/main/CODE_OF_CONDUCT.md .. _security policy: https://github.com/mariocesar/sorl-thumbnail/blob/main/SECURITY.md