13.0.0 (unreleased)

Security

TODO

TODO

CVE YYYY-XXXXX: TODO

TODO

Backwards incompatible changes

Python 3.10

Pillow has dropped support for Python 3.10, which reached end-of-life in October 2026.

Saving I mode images as PNG

In order to fit the 32 bits of I mode images into PNG, when PNG images can only contain at most 16 bits for a channel, Pillow has been clipping the values. Rather than quietly changing the data, this is now removed. Instead, the image can be converted to another mode before saving:

from PIL import Image
im = Image.new("I", (1, 1))
im.convert("I;16").save("out.png")

Image.fromarray mode parameter

Using the mode parameter in fromarray() was deprecated in Pillow 11.3.0. In Pillow 12.0.0, this was partially reverted, and now the only functionality removed is when the mode changes data types. Since pixel values do not contain information about palettes or color spaces, the parameter can still be used to place grayscale L mode data within a P mode image, or read RGB data as YCbCr for example. If omitted, the mode will be automatically determined from the object’s shape and type.

Image.Image.get_child_images()

Image.Image.get_child_images() has been moved to ImageFile.ImageFile.get_child_images(). The method uses an image’s file pointer, and so child images could only be retrieved from an PIL.ImageFile.ImageFile instance.

Image._show

Image._show has been removed. Use show() instead.

ImageCms.ImageCmsProfile.product_name and .product_info

ImageCms.ImageCmsProfile.product_name and the corresponding .product_info attributes have been removed. They were set to None since Pillow 2.3.0.

Deprecations

JpegImageFile.load_djpeg

JpegImageFile.load_djpeg has been deprecated, and will be removed in Pillow 14 (2027-10-15).

Use the built-in JPEG decoder instead, or call djpeg directly and decode the resulting image with Pillow.

ImageQt align8to32()

ImageQt.align8to32() has been deprecated. This was an undocumented helper function intended for internal use, so there is no replacement.

API changes

TODO

TODO

API additions

Added strip_namespaces argument to Image.getxmp()

getxmp() now accepts an optional keyword argument of strip_namespaces. It is set to True by default, stripping each tag’s XML namespace URI prefix as before. If set to False, each tag’s full {namespace-uri}local-name form is kept instead, avoiding collisions between tags that share a local name across different namespaces.

New resizing filters

Two new filters are available for resize() and thumbnail(): Image.Resampling.MKS2013 and Image.Resampling.MKS2021. These are versions of the Magic Kernel Sharp filter.

Other changes

Python 3.15

Pillow 12.3.0 had wheels built against Python 3.15 beta, available as a preview to help projects prepare for 3.15, and to ensure Pillow could be used immediately at the release of 3.15.0 final (2026-10-01, PEP 790).

Pillow 13.0.0 now officially supports Python 3.15.