When performing decompression bomb checks, Pillow did not reject images with excessive width and zero height, or zero width and excessive height. That has now been fixed.
This effectively dates to the PIL fork, since problem images would still have been processed before Pillow started checking for decompression bombs.
Added ImageFont.MAX_STRING_LENGTH.
Note
More information about this vulnerability included in database record 2023-44271
To protect against potential DOS attacks when using arbitrary strings as text input, Pillow will now raise a :pyValueError
if the number of characters passed into ImageFont methods is over a certain limit, :pyPIL.ImageFont.MAX_STRING_LENGTH
.
This threshold can be changed by setting :pyPIL.ImageFont.MAX_STRING_LENGTH
. It can be disabled by setting ImageFont.MAX_STRING_LENGTH = None
.
im.category
has been removed, along with the related Image.NORMAL
, Image.SEQUENCE
and Image.CONTAINER
attributes.
To determine if an image has multiple frames or not, getattr(im, "is_animated", False)
can be used instead.
Support for Tk/Tcl 8.4 has been removed.
Since deprecation in Pillow 8.3.0, the convert_dict_qtables
method no longer performed any operations on the data given to it, and has been removed.
Before Pillow 8.3.0, ImagePalette
required palette data of particular lengths by default, and the size
parameter could be used to override that. Pillow 8.3.0 removed the default required length, also removing the need for the size
parameter.
The file
argument in :py~PIL.ImageShow.Viewer.show_file()
has been removed and replaced by path
.
In effect, viewer.show_file("test.jpg")
will continue to work unchanged.
A number of constants have been removed. Instead, :pyenum.IntEnum
classes have been added.
Removed | Use instead |
---|---|
Image.LINEAR |
Image.BILINEAR or Image.Resampling.BILINEAR |
Image.CUBIC |
Image.BICUBIC or Image.Resampling.BICUBIC |
Image.ANTIALIAS |
Image.LANCZOS or Image.Resampling.LANCZOS |
ImageCms.INTENT_PERCEPTUAL |
ImageCms.Intent.PERCEPTUAL |
ImageCms.INTENT_RELATIVE_COLORMETRIC |
ImageCms.Intent.RELATIVE_COLORMETRIC |
ImageCms.INTENT_SATURATION |
ImageCms.Intent.SATURATION |
ImageCms.INTENT_ABSOLUTE_COLORIMETRIC |
ImageCms.Intent.ABSOLUTE_COLORIMETRIC |
ImageCms.DIRECTION_INPUT |
ImageCms.Direction.INPUT |
ImageCms.DIRECTION_OUTPUT |
ImageCms.Direction.OUTPUT |
ImageCms.DIRECTION_PROOF |
ImageCms.Direction.PROOF |
ImageFont.LAYOUT_BASIC |
ImageFont.Layout.BASIC |
ImageFont.LAYOUT_RAQM |
ImageFont.Layout.RAQM |
BlpImagePlugin.BLP_FORMAT_JPEG |
BlpImagePlugin.Format.JPEG |
BlpImagePlugin.BLP_ENCODING_UNCOMPRESSED |
BlpImagePlugin.Encoding.UNCOMPRESSED |
BlpImagePlugin.BLP_ENCODING_DXT |
BlpImagePlugin.Encoding.DXT |
BlpImagePlugin.BLP_ENCODING_UNCOMPRESSED_RAW_RGBA |
BlpImagePlugin.Encoding.UNCOMPRESSED_RAW_RGBA |
BlpImagePlugin.BLP_ALPHA_ENCODING_DXT1 |
BlpImagePlugin.AlphaEncoding.DXT1 |
BlpImagePlugin.BLP_ALPHA_ENCODING_DXT3 |
BlpImagePlugin.AlphaEncoding.DXT3 |
BlpImagePlugin.BLP_ALPHA_ENCODING_DXT5 |
BlpImagePlugin.AlphaEncoding.DXT5 |
FtexImagePlugin.FORMAT_DXT1 |
FtexImagePlugin.Format.DXT1 |
FtexImagePlugin.FORMAT_UNCOMPRESSED |
FtexImagePlugin.Format.UNCOMPRESSED |
PngImagePlugin.APNG_DISPOSE_OP_NONE |
PngImagePlugin.Disposal.OP_NONE |
PngImagePlugin.APNG_DISPOSE_OP_BACKGROUND |
PngImagePlugin.Disposal.OP_BACKGROUND |
PngImagePlugin.APNG_DISPOSE_OP_PREVIOUS |
PngImagePlugin.Disposal.OP_PREVIOUS |
PngImagePlugin.APNG_BLEND_OP_SOURCE |
PngImagePlugin.Blend.OP_SOURCE |
PngImagePlugin.APNG_BLEND_OP_OVER |
PngImagePlugin.Blend.OP_OVER |
The stub image plugin FitsStubImagePlugin
has been removed. FITS images can be read without a handler through ~PIL.FitsImagePlugin
instead.
Several functions for computing the size and offset of rendered text have been removed:
Removed | Use instead |
---|---|
FreeTypeFont.getsize() and FreeTypeFont.getoffset() |
:py.FreeTypeFont.getbbox and :py.FreeTypeFont.getlength |
FreeTypeFont.getsize_multiline() |
:py.ImageDraw.multiline_textbbox |
ImageFont.getsize() |
:py.ImageFont.getbbox and :py.ImageFont.getlength |
TransposedFont.getsize() |
:py.TransposedFont.getbbox and :py.TransposedFont.getlength |
ImageDraw.textsize() and ImageDraw.multiline_textsize() |
:py.ImageDraw.textbbox , :py.ImageDraw.textlength and :py.ImageDraw.multiline_textbbox |
ImageDraw2.Draw.textsize() |
:py.ImageDraw2.Draw.textbbox and :py.ImageDraw2.Draw.textlength |
The undocumented fill
parameter of :py.FreeTypeFont.getmask2
has been removed.
The box
parameter was unused and has been removed.
Qt 5 reached end-of-life on 2020-12-08 for open-source users (and will reach EOL on 2023-12-08 for commercial licence holders).
Support for PyQt5 and PySide2 has been removed from ImageQt
. Upgrade to PyQt6 or PySide6 instead.
This undocumented method has been removed.
Since Pillow's C API is now faster than PyAccess on PyPy, :py~PIL.PyAccess
has been deprecated and will be removed in Pillow 11.0.0 (2024-10-15). Pillow's C API will now be used by default on PyPy instead.
Image.USE_CFFI_ACCESS
, for switching from the C API to PyAccess, is similarly deprecated.
An optional line width
parameter has been added to ImageDraw.Draw.regular_polygon
.
:py~PIL.Image.Image.getbbox
now accepts a keyword argument of alpha_only
. This is an optional flag, defaulting to True
. If True
and the image has an alpha channel, trim transparent pixels. Otherwise, trim pixels when all channels are zero.
32-bit wheels are no longer provided.
In addition to display()
and display_png
, display_jpeg()
can now also be used to display images in IPython:
from PIL import Image
from IPython.display import display_jpeg
im = Image.new("RGB", (100, 100), (255, 0, 0))
display_jpeg(im)
TIFF images with signed integer data, 8 bits per sample and a photometric interpretation of BlackIsZero can now be read.