# What changed in pillow

> 188 changes in pillow 12 to 13 from its official release notes, upgrade guides and advisories: 42 breaking, 9 deprecations, 25 security, 11 new APIs and options. Each one cited. Sources checked 2026-10-18. HTML: https://unstale.sh/pypi/pillow/

To see which of these apply to a repository, run `npx @unstale/cli init` in it.

## pillow 13

### Breaking changes

- Duration and timestamp are removed from AVIF info after seek. (13.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/13.0.0)
- Invalid and non-finite radii are rejected. (13.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/13.0.0)
- The Makernote IFD constant is removed. (13.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/13.0.0)
- FITS data is treated as big-endian. (13.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/13.0.0)
- The undocumented GIF saving helper is removed. (13.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/13.0.0)
- When an ICO image is smaller than 16×16, saving preserves its original size by default. (13.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/13.0.0)
- When saving a frame without a matching size, the next smallest provided image is used. (13.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/13.0.0)
- Exporting Arrow arrays from non-contiguous images is rejected. (13.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/13.0.0)
- Calling quantize() with an empty palette now raises an error. (13.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/13.0.0)
- When height is scaled down significantly more than width, resizing now proceeds vertically first. (13.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/13.0.0)
- RGBA and LA resizing now uses reducing_gap. (13.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/13.0.0)
- Pen widths are used when drawing shape outlines. (13.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/13.0.0)
- Invalid arguments now raise ValueError instead of triggering an assertion. (13.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/13.0.0)
- Values of bits outside 1–8 now raise ValueError. (13.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/13.0.0)
- Creating an ImagePalette with an unsupported mode now raises an error. (13.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/13.0.0)
- Text is wrapped even when no scaling is required. (13.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/13.0.0)
- JPEG streams with scanlines that are too wide or have too many components are rejected. (13.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/13.0.0)
- The default max_nesting limit is set to 900. (13.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/13.0.0)
- Support for Python 3.10 is dropped; developers must use a supported Python version. (13.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/13.0.0)
- TIFFs whose unpacker row is wider than libtiff's decoded row are rejected. (13.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/13.0.0)
- The first of duplicate TIFF tags is retained. (13.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/13.0.0)
- Duration and timestamp are removed from WebP info after seek. (13.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/13.0.0)
- WMF dimensions are limited to 0–65535 when loading. (13.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/13.0.0)
- XMP info is no longer a tuple. (13.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/13.0.0)

### Security

- Decompression bomb checks are added when seek opens a new format and after SPIDER seek. (13.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/13.0.0)
- Ghostscript is prevented from rendering beyond the decompression bomb limit. (13.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/13.0.0)
- A decompression bomb check is added for Windows clipboard images. (13.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/13.0.0)
- Retained TIFF tag data is bounded by the stream size. (13.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/13.0.0)

### Deprecations

- The IM image format is deprecated. (13.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/13.0.0)
- ImageQt.align8to32() is deprecated in favour of the raw encoder stride. (13.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/13.0.0)
- JpegImageFile.load_djpeg is deprecated. (13.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/13.0.0)

### New APIs and options

- Image.getxmp() gains a strip_namespaces argument. (13.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/13.0.0)
- Magic Kernel Sharp resizing modes are now supported. (13.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/13.0.0)
- PSDraw.text gains an escape argument. (13.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/13.0.0)

### Performance

- Image.filter() is faster for I;16* modes. (13.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/13.0.0)
- getpixel() and get_flattened_data() are faster. (13.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/13.0.0)
- Image.offset is faster. (13.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/13.0.0)
- ImageChops.difference() is faster. (13.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/13.0.0)
- PDF object IDs are assigned in constant time. (13.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/13.0.0)

### Behavior and default changes

- Explicit BASIC layout is respected in font_variant(). (13.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/13.0.0)
- ImageMath operations now accept floating point constants. (13.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/13.0.0)
- ImageOps invert, posterize, and solarize now support P images. (13.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/13.0.0)
- ImageOps can now create images with zero dimensions. (13.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/13.0.0)
- Font handling now supports pathlib paths. (13.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/13.0.0)
- Pillow adds support for Python 3.15. (12.3.0, 13.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/13.0.0), [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.3.0)
- Zero-length members in tar files are supported. (13.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/13.0.0)
- Greyscale TIFFs with ExtraSamples 0 or 1 are supported. (13.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/13.0.0)
- XBM headers now allow C comments. (13.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/13.0.0)

### Fixes and other changes

- Decoding an AVIF image no longer blocks all threads. (13.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/13.0.0)
- Truncated or corrupt gzip FITS data now raises OSError. (13.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/13.0.0)
- Invalid radii are rejected. (13.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/13.0.0)
- Converting from I;16N to I or F no longer clips 16-bit values. (13.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/13.0.0)
- Zero-dimension images can be passed to fromarrow(). (13.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/13.0.0)
- Image.getbbox() is faster and is fixed for I;16 modes. (13.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/13.0.0)
- Zero-dimension images are supported by related image filters and offset operations. (13.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/13.0.0)
- ImageChops.offset is fixed for 16-bit modes and is faster. (13.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/13.0.0)
- ImageColor.getcolor() now handles premultiplied alpha modes. (13.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/13.0.0)
- The border type hint is corrected. (13.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/13.0.0)
- The background color is corrected when padding P mode images. (13.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/13.0.0)
- Transparency is preserved when padding and expanding images. (13.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/13.0.0)
- compact() returns zero when there are no points to remove. (13.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/13.0.0)
- The image position is restored after an error. (13.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/13.0.0)
- ImageStat variance is prevented from becoming negative. (13.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/13.0.0)
- Opening a JP2 image with an unrecognized mode now raises an error. (13.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/13.0.0)
- Unexpected end-of-file in a JPEG header is handled. (13.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/13.0.0)
- PDF page trees are walked iteratively, and page loops raise an error. (13.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/13.0.0)
- Support for PyPy 3.12 is added. (13.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/13.0.0)
- Truncated tRNS, gAMA, and cHRM chunks now raise ValueError. (13.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/13.0.0)
- The bits option is applied when saving L mode PNG images, without padding the palette when bits is specified. (13.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/13.0.0)
- PSD layer tiles are read from the correct file offset. (13.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/13.0.0)
- TIFF tag values are validated against libtiff's field definitions before being passed to TIFFSetField. (13.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/13.0.0)
- TIFF strip and tile buffers are cleared beyond previously decoded data. (13.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/13.0.0)
- TIFF ColorMap length is corrected when saving with libtiff. (13.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/13.0.0)
- TIFF seek no longer changes MicImageFile frame count or animation state. (13.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/13.0.0)
- TIFF scanline geometry tags are taken from the image rather than tiffinfo or EXIF. (13.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/13.0.0)
- A heap buffer overflow when saving TIFF to BytesIO is fixed. (13.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/13.0.0)
- TIFFs with unexpected tile sizes now raise OSError. (13.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/13.0.0)
- TIFF ColorMap length is checked against BitsPerSample. (13.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/13.0.0)
- The WebP canvas size is checked before creating a decoder. (13.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/13.0.0)

## pillow 12

### Breaking changes

- FontFile classes now perform decompression bomb checks. (12.3.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.3.0)
- Non-image modes are no longer supported by ImageCms. (12.3.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.3.0)
- ImageMath.unsafe_eval() no longer sets eval() globals. (12.3.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.3.0)
- macOS retina screenshots are no longer resized by default. (12.3.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.3.0)
- 1 mode images are no longer saved as TGA with run-length encoding. (12.3.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.3.0)
- Raises ValueError if the tag value is not bytes. (12.3.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.3.0)
- Raises ValueError if the tag value is not bytes. (12.3.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.3.0)
- Rejects non-numeric elements in list coordinates. (12.2.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.2.0)
- Always calls StubHandler open() when opening a StubImageFile. (12.2.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.2.0)
- Resizes tall images vertically first. (12.2.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.2.0)
- Deleting an EXIF IFD tag now also deletes its IFD data. (12.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.0.0)
- FreeType versions 2.9.0 and earlier are no longer supported. (12.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.0.0)
- Quantizing RGB images now fills the alpha channel. (12.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.0.0)
- ImageMorph operations must have length 1. (12.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.0.0)
- Negative offsets are no longer allowed with memory mapping. (12.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.0.0)
- Support for PyPy3.10 was dropped. (12.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.0.0)
- Support for Python 3.9 was dropped, so applications need a supported Python version to use this release. (12.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.0.0)
- Converting RGBA to PA now uses RGB-to-P quantization. (12.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.0.0)

### Security

- A decompression bomb check is now applied to GdImageFile. (12.3.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.3.0)
- Pillow `BdfFontFile`: `Image.new()` called without `_decompression_bomb_check()` — bomb protection bypass via font loading (12.3.0) — [security advisory](https://github.com/advisories/GHSA-45HQ-CXWH-F6VC)
- Pillow: Controlled heap out-of-bounds write in Pillow `ImageCmsTransform.apply()` via output mode mismatch (12.3.0) — [security advisory](https://github.com/advisories/GHSA-9HW9-CH79-4VH6)
- Pillow: Decompression Bomb DoS via PdfParser.PdfStream.decode() (12.3.0) — [security advisory](https://github.com/advisories/GHSA-JJJ6-MW9F-P565)
- Pillow EpsImagePlugin negative %%BeginBinary byte count causes infinite loop denial of service (12.3.0) — [security advisory](https://github.com/advisories/GHSA-PG7V-JWJ7-P798)
- Pillow: `FontFile.compile()`: `Image.new()` called without `_decompression_bomb_check()` (12.3.0) — [security advisory](https://github.com/advisories/GHSA-5X94-69RX-G8H2)
- Pillow `GdImageFile._open()`: image dimensions accepted without `_decompression_bomb_check()` (12.3.0) — [security advisory](https://github.com/advisories/GHSA-PHJ9-MV4W-65PM)
- Pillow: Heap out-of-bounds write `Image.paste()` / `Image.crop()` via signed coordinate overflow (12.3.0) — [security advisory](https://github.com/advisories/GHSA-6R8X-57C9-28J4)
- Pillow: Heap out-of-bounds write in `ImageFilter.RankFilter` via integer overflow in `ImagingExpand` (12.3.0) — [security advisory](https://github.com/advisories/GHSA-XJ96-63GP-2GMR)
- Pillow JPEG2000 tiled decode retains a growing scratch buffer and can be used for denial of service (12.3.0) — [security advisory](https://github.com/advisories/GHSA-VJC4-5QP5-M44J)
- Pillow: Out-of-bounds read via attacker-controlled row stride on Pillow's mmap path (McIdas AREA files) (12.3.0) — [security advisory](https://github.com/advisories/GHSA-62P4-GMF7-7G93)
- Pillow `PcfFontFile._load_bitmaps()`: `Image.frombytes()` called without `_decompression_bomb_check()` — bomb protection bypass via PCF font loading (12.3.0) — [security advisory](https://github.com/advisories/GHSA-8V84-F9PQ-WR9X)
- Pillow TGA RLE encoder can serialize up to ~57 KB of adjacent heap data into generated images (12.3.0) — [security advisory](https://github.com/advisories/GHSA-FJ7V-R99M-22GQ)
- Pillow: WindowsViewer.get_command() OS command injection via unescaped shell path (12.3.0) — [security advisory](https://github.com/advisories/GHSA-4X4J-2G7C-83W6)
- FITS GZIP decompression bomb in Pillow (12.2.0) — [security advisory](https://github.com/advisories/GHSA-WHJ4-6X5X-4V2J)
- Pillow has a heap buffer overflow with nested list coordinates (12.2.0) — [security advisory](https://github.com/advisories/GHSA-5XMW-VC9V-4WF2)
- Pillow has a PDF Parsing Trailer Infinite Loop (DoS) (12.2.0) — [security advisory](https://github.com/advisories/GHSA-R73J-PQJ5-W3X7)
- Pillow has an integer overflow when processing fonts (12.2.0) — [security advisory](https://github.com/advisories/GHSA-WJX4-4JCJ-G98J)
- Pillow has an OOB Write with Invalid PSD Tile Extents (Integer Overflow) (12.2.0) — [security advisory](https://github.com/advisories/GHSA-PWV6-VV43-88GR)
- Pillow affected by out-of-bounds write when loading PSD images (12.1.1) — [security advisory](https://github.com/advisories/GHSA-CFH3-3JMP-RVHC)
- The length of read operations is now limited when loading PIL font data. (12.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.0.0)

### Deprecations

- A new method is available as the preferred alternative to getdata(). (12.1.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.1.0)
- getdata() is deprecated in favour of get_flattened_data(). (12.1.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.1.0)
- Image._show is deprecated; developers using this API should plan to stop relying on it. (12.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.0.0)
- The mode parameter is deprecated only when it changes the data type. (12.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.0.0)
- The product_info attribute is deprecated. (12.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.0.0)
- The product_name attribute is deprecated. (12.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.0.0)

### New APIs and options

- An abstract BaseImageFont class is added. (12.3.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.3.0)
- ImageFont can also be used with ImageText. (12.3.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.3.0)
- ImageFont can also be used with ImageText. (12.3.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.3.0)
- Adds FontFile.to_imagefont(). (12.2.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.2.0)
- Adds the Exif tag FrameRate. (12.2.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.2.0)
- Adds text wrapping through ImageText.Text.wrap(). (12.2.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.2.0)
- Font variation styles can now be duplicated. (12.1.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.1.0)
- On macOS, ImageGrab.grab() can now receive a window ID. (12.1.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.1.0)

### Performance

- alpha_composite is faster. (12.3.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.3.0)
- Image.blend() is faster. (12.3.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.3.0)
- Image.fill() is faster. (12.3.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.3.0)
- Image.filter() is faster. (12.3.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.3.0)
- Image.getchannel() is faster. (12.3.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.3.0)
- Image.linear_gradient() is faster. (12.3.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.3.0)
- Image.merge() is faster. (12.3.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.3.0)
- Image.putalpha() is faster. (12.3.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.3.0)
- Image.radial_gradient() is faster. (12.3.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.3.0)
- Image.resample() is faster. (12.3.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.3.0)
- Image.split() is faster. (12.3.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.3.0)
- ImageChops operations are faster. (12.3.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.3.0)
- matrix is faster. (12.3.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.3.0)
- negative is faster. (12.3.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.3.0)
- quantize is faster. (12.3.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.3.0)

### Behavior and default changes

- Opening and saving L mode AVIF images is supported with libavif 1.3.0 or newer. (12.3.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.3.0)
- Adds support for reading JPEG2000 images with CMYK palettes. (12.2.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.2.0)
- Saving APNG images now supports float durations. (12.1.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.1.0)
- build_default_lut() now returns the LUT. (12.1.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.1.0)
- MorphOp now allows 1 mode images. (12.1.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.1.0)
- Writing IFD, SIGNED_RATIONAL, and InkNames TIFF tags is now supported. (12.1.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.1.0)
- alpha_composite now supports LA images. (12.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.0.0)
- Saving variable length rational TIFF tags is supported by default. (12.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.0.0)

### Fixes and other changes

- The XOR mask is now applied to 1 and L mode CUR images. (12.3.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.3.0)
- Raises ValueError if the tile size is not 64px by 64px. (12.3.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.3.0)
- Raises ValueError when P;2L or P;4L data is truncated. (12.3.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.3.0)
- Raises ValueError if the border format is unsupported. (12.3.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.3.0)
- Raises OverflowError if the number of vertices is too large. (12.3.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.3.0)
- Parsing PSD layers no longer raises an error for an unknown channel ID. (12.3.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.3.0)
- The type hint for xy now allows lists. (12.3.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.3.0)
- Size and rank are validated when initializing RankFilter, and large filter sizes are validated. (12.3.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.3.0)
- Corrects the error check when encoding AVIF images. (12.2.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.2.0)
- Corrects BMP pixel data offsets when palette entries have different sizes. (12.2.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.2.0)
- Fixes BMP RLE delta escape reading from the wrong file position. (12.2.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.2.0)
- Encoding an empty image raises ValueError. (12.2.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.2.0)
- Raises an error if the ImageGrab subprocess returns a non-zero return code. (12.2.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.2.0)
- Closes the file handle only when ImagePalette.save() opened it internally. (12.2.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.2.0)
- Does not use palettes from grayscale or bilevel colorspaces when reading JPEG2000 images. (12.2.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.2.0)
- Raises EOFError when seeking too far in PSD data. (12.2.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.2.0)
- Fills the alpha channel when a TGA v2 extension area specifies no alpha. (12.2.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.2.0)
- Ignores unspecified extra samples for TIFF separate planar configuration. (12.2.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.2.0)
- Raises an error when a trailer chain loops back on itself. (12.2.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.2.0)
- Fixes an unexpected error when saving images with zero dimensions. (12.2.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.2.0)
- Fixed an out-of-bounds write when tile extents are invalid. (12.1.1) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.1.1)
- Patched libavif for compatibility with svt-av1 4.0, which matters when building Pillow with that version. (12.1.1) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.1.1)
- A ZeroDivisionError in DdsImagePlugin is fixed. (12.1.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.1.0)
- All non-zero transparency values are now read as 255. (12.1.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.1.0)
- Encoder options are now applied when saving multiple PNG frames. (12.1.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.1.0)
- Parsing EPS metadata now seeks past BeginBinary data. (12.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.0.0)
- Pasting an image onto itself at a lower position now copies from the bottom. (12.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.0.0)
- RGBA palettes are now supported when expanding images. (12.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.0.0)
- A ZeroDivisionError in ImageStat was fixed. (12.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.0.0)
- Reading RGB and CMYK IPTC images was fixed. (12.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.0.0)
- Python 3.14 is supported. (12.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.0.0)
- Loading rotated PCD images was fixed, including setting the correct size after opening. (12.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.0.0)
- Two-band histograms now use the correct bands. (12.0.0) — [release notes](https://github.com/python-pillow/Pillow/releases/tag/12.0.0)
