| Name | Modified | Size | Downloads / Week |
|---|---|---|---|
| Parent folder | |||
| pillow-13.0.0.cdx.json | 2026-10-16 | 21.9 kB | |
| 13.0.0 source code.tar.gz | 2026-10-16 | 47.2 MB | |
| 13.0.0 source code.zip | 2026-10-16 | 48.0 MB | |
| README.md | 2026-10-16 | 24.3 kB | |
| Totals: 4 Items | 95.2 MB | 40 | |
https://pillow.readthedocs.io/en/stable/releasenotes/13.0.0.html
Removals
- Remove undocumented
GifImagePlugin._save_netpbm[#9901] [@akx] - Remove ExifTags.IFD.Makernote [#9850] [@radarhere]
- Drop support for Python 3.10 [#9750] [@hugovk]
- Remove deprecations for Pillow 13.0.0 [#9751] [@radarhere]
Deprecations
- Deprecate IM image format [#9849] [@radarhere]
- Deprecate ImageQt align8to32() in favour of raw encoder stride [#9940] [@akx]
- Deprecate JpegImageFile.load_djpeg [#9924] [@akx]
Documentation
- Update release notes for Pillow 13.0.0 [#10223] [@hugovk]
- Correct the ImageOps.fit centering corner documentation [#10118] [@FanWu-ai]
- Update Tidelift links [#10102] [@radarhere]
- Correct bullet point syntax in release notes [#10069] [@radarhere]
- Update ImageDraw signatures in docs [#10065] [@ZainnQureshii]
- Update macOS tested Pillow versions [#10048] [@hugovk]
- Add pillow-wmf and pillow-zx-spectrum to third-party plugins list [#10037] [@bitplane]
- Delete CLAUDE.md [#10027] [@hugovk]
- Add pillow-lunasvg to third-party plugins list [#10016] [@Maksim-Burtsev]
- Extend security policy [#10018] [@hugovk]
- Update Color3DLUT description [#10004] [@radarhere]
- Document the internal image distinctness constraints [#9752] [@akx]
- Update macOS tested Pillow versions [#10000] [@radarhere]
- Link security policy in project metadata [#9980] [@hugovk]
- Image.new(): correct docstring and comment about uninitialized memory [#9960] [@akx]
- Add AGENTS.md [#9582] [@aclark4life]
- Add release notes for [#8811] [#9937] [@radarhere]
- Fixed typo [#9923] [@radarhere]
- Fixed typo [#9922] [@radarhere]
- C interface is internal [#9879] [@radarhere]
- Correct function references [#9895] [@radarhere]
- Revert move from python-pillow.org to python-pillow.github.io [#9830] [@aclark4life]
- Add additional CVE numbers to 12.3.0 release notes [#9777] [@radarhere]
- Remove remaining :rtype:s from docstrings [#9742] [@akx]
- Update macOS tested Pillow versions [#9759] [@radarhere]
Dependencies
- Update dependency cibuildwheel to v4.3.1 [#10175] [@renovate[bot]]
- Update dependency cibuildwheel to v4.3.0 [#10132] [@renovate[bot]]
- Update dependency harfbuzz to v14.5.0 [#10108] [@renovate[bot]]
- Update github-actions [#10111] [@renovate[bot]]
- Update dependency check-jsonschema to v0.38.2 [#10110] [@renovate[bot]]
- Update dependency fribidi to v1.0.17 [#10106] [@renovate[bot]]
- Update dependency xz to v5.8.4 [#10107] [@renovate[bot]]
- Add support for PyPy3.12 [#10047] [@hugovk]
- Update dependency cibuildwheel to v4.2.1 [#10007] [@renovate[bot]]
- Install latest Ghostscript when testing Windows [#9978] [@radarhere]
- Update Ghostscript to 10.8.0 [#9972] [@radarhere]
- Update dependency cibuildwheel to v4.2.0 [#9947] [@renovate[bot]]
- Update github-actions [#9952] [@renovate[bot]]
- Update dependency harfbuzz to v14.4.0 [#9948] [@renovate[bot]]
- Update dependency mypy to v2.3.1 [#9950] [@renovate[bot]]
- Update dependency check-jsonschema to v0.38.0 [#9951] [@renovate[bot]]
- Update nasm to 3.02 [#9857] [@radarhere]
- Update raqm to 0.11.0 [#9819] [@radarhere]
- Update dependency jpegturbo to v3.2.0 [#9840] [@renovate[bot]]
- Update github-actions [#9845] [@renovate[bot]]
- Update github-actions [#9842] [@renovate[bot]]
- Update dependency mypy to v2.3.0 [#9841] [@renovate[bot]]
- Update dependency tiff to v4.7.2 [#9839] [@renovate[bot]]
- Update dependency cibuildwheel to v4.1.1 [#9838] [@renovate[bot]]
- Update dependency check-jsonschema to v0.37.4 [#9837] [@renovate[bot]]
- [pre-commit.ci] pre-commit autoupdate [#9775] [@pre-commit-ci[bot]]
- Update github-actions [#9763] [@renovate[bot]]
- Update dependency check-jsonschema to v0.37.3 [#9756] [@renovate[bot]]
- Update dependency cibuildwheel to v4.1.0 [#9757] [@renovate[bot]]
Testing
- Install test dependencies for benchmarks [#10212] [@radarhere]
- Upgrade benchmark to Python 3.15 [#10197] [@radarhere]
- Do not install test dependencies in Install step [#10205] [@radarhere]
- Skip test if OpenJPEG is not available [#10204] [@radarhere]
- Add further FPX test images [#10157] [@radarhere]
- Install palette in core image before using directly [#10155] [@radarhere]
- NumPy now supports Python 3.15 [#10134] [@radarhere]
- Use
pathlib.Pathto find test images and fonts [#10079] [@akx] - Add some benchmarks for ImageMath [#10071] [@akx]
- Mark test_embeddable as xfail on MinGW [#10067] [@radarhere]
- CI: Fix Docker coverage upload [#10054] [@hugovk]
- Add support for PyPy3.12 [#10047] [@hugovk]
- Clean up test_pattern_syntax_error's param ids [#10036] [@akx]
- Add benchmark for image equality [#10033] [@akx]
- Remove test_empty_image test [#9958] [@akx]
- Only run TestFileLibTiff.test_save_many_compressed() on Windows [#9944] [@akx]
- Reduce memory used in tests [#9993] [@radarhere]
- Remove test support for libjpeg-turbo 2.0 under Valgrind [#9992] [@radarhere]
- Enable pytest-xdist when testing wheels [#9979] [@hugovk]
- Update Ghostscript to 10.8.0 [#9972] [@radarhere]
- Run tests in parallel with pytest-xdist [#9945] [@akx]
- Use python3 in benchmark workflow [#9971] [@radarhere]
- Adjust package installation in Linux/macOS CI [#9954] [@akx]
- Simplify test code [#9967] [@radarhere]
- Improve test stability [#9933] [@akx]
- Do not install PyQt6 dependencies [#9955] [@radarhere]
- Test ImageChops.offset() with zero-size images [#9953] [@espressolee]
- Add test for PdfParser linearize_page_tree() [#9835] [@radarhere]
- Test remap_palette()'s source_palette argument [#9867] [@pranjalm37]
- Remove unexpected characters [#9871] [@radarhere]
- Add context manager [#9864] [@radarhere]
- Replace custom test code [#9858] [@hugovk]
- Run mypy with parallel workers [#9861] [@hugovk]
- New benchmarks [#9832] [@akx]
- Improve benchmark test image [#9831] [@akx]
- Use
ubuntu-slimfor lightweight jobs [#9846] [@hugovk] - Use
pytest.approx,pytest.raisesandpytest.skip[#9844] [@hugovk] - Remove test support for NumPy < 1.23 [#9796] [@radarhere]
- Remove write method from test [#9806] [@radarhere]
- Add coverage to tox [#9774] [@hugovk]
Type hints
- Remove type hint for deprecated im.putdata(im.getdata()) [#10059] [@radarhere]
- Correct ImageOps.crop border type hint [#9989] [@lllleolin-max]
- Move typing imports under
TYPE_CHECKINGblock [#9827] [@hugovk] - Convert parallel setting to int [#9869] [@radarhere]
Other changes
- Validate TIFF tag values against libtiff's own field definition before TIFFSetField [#10227] [@hugovk]
- Take libtiff scanline geometry tags from the image, not tiffinfo/exif [#10226] [@hugovk]
- Bound retained TIFF tag data by stream size [#10225] [@hugovk]
- Fix heap buffer overflow in _tiffWriteProc when saving TIFF to BytesIO [#10224] [@hugovk]
- Use bit plane row size for P;2L and P;4L rawmodes [#10186] [@aclark4life]
- Allow floating point constants in ImageMath operations [#10218] [@vera-rubin]
- Correct reusing a palette entry [#10084] [@sergioperezcheco]
- Add support for ImageOps invert, posterize and solarize of P images [#10174] [@RavSinghChandan]
- Respect explicit BASIC layout in font_variant() [#10214] [@iAlturki]
- Improve support for TGA images in P mode with an RGBA palette [#10211] [@sungbin1015]
- Do not lazily import olefile [#10213] [@radarhere]
- Keep the first of duplicate TIFF tags [#10210] [@radarhere]
- Use reducing_gap when resizing RGBA and LA images [#10208] [@antonsoo]
- Use pen widths when drawing ImageDraw2 shape outlines [#10207] [@xiehuanyi]
- Run garbage collection after closing memoryview on PyPy [#10203] [@radarhere]
- Reject TIFFs whose unpacker row is wider than libtiff's decoded row [#10201] [@aclark4life]
- Write all channels when saving a one pixel wide RGB image as PCX [#10113] [@SulimanAbdulrazzaq]
- Fix drawing on I;16B images [#9982] [@akx]
- Free Threading fixes [#10196] [@wiredfool]
- Correct directory name in depends/install_openjpeg.sh [#10199] [@radarhere]
- Allow ImageOps to create zero dimension images [#9673] [@radarhere]
- Clarify license of vendored FriBiDi shim [#10194] [@aclark4life]
- Ignore (0, 0) BMP DPI [#10187] [@radarhere]
- Do not write IFD1 as a tag when converting EXIF to bytes [#10188] [@sungbin1015]
- Reject exporting Arrow arrays from non-contiguous images [#10172] [@wiredfool]
- Check WebP canvas size before creating decoder [#10190] [@radarhere]
- Apply "bits" to saving L mode PNG images [#10168] [@radarhere]
- Walk PDF page tree iteratively [#10185] [@aclark4life]
- Allow C comments in XBM headers [#10164] [@aclark4life]
- Clear TIFF strip and tile buffer beyond previously decoded data [#10184] [@aclark4life]
- Fix KeyError on missing Interop or MakerNote IFD [#10177] [@RavSinghChandan]
- Fix ColorMap length when saving TIFF images with libtiff [#10178] [@MohammediYunus]
- Raise ValueError for posterize bits outside 1-8 [#10173] [@RavSinghChandan]
- Correct "Raw profile type exif" info after exif_transpose() [#10145] [@sungbin1015]
- Raise OSError for truncated or corrupt gzip FITS data [#10146] [@RavSinghChandan]
- Improve mmap buffer length check [#10147] [@aryangorde6]
- Speed up ImageChops.difference() [#10154] [@SimBuddy]
- Handle unexpected EOF in JPEG header [#10150] [@Kesavamoorthig06]
- Correct applying OpenJPEG patch [#10171] [@radarhere]
- Read from tall PSD tiles safely [#10151] [@Kesavamoorthig06]
- Raise error when opening if JP2 mode is unrecognized [#10135] [@radarhere]
- Add Apache-2.0 license header to Arrow.h [#10162] [@aclark4life]
- Raise ValueError for XPM pixel data with undefined color key [#10149] [@Kesavamoorthig06]
- Fix FLI palette OverflowError [#10148] [@Kesavamoorthig06]
- Replace rgba2rgb convert function with identical rgb2rgba [#10169] [@radarhere]
- Avoid copying zero-sized image buffers [#10158] [@SimBuddy]
- Speed up histograms [#10161] [@SimBuddy]
- Apply uclouvain/openjpeg#1621 to address OSV-2025-219 [#10156] [@radarhere]
- Mark Python palette as dirty after conversion to WEB palette [#10008] [@radarhere]
- Only load new palette in putpalette() if it contains raw data [#10035] [@radarhere]
- Only combine PNG frames if the combined duration is still writable [#10070] [@radarhere]
- Support greyscale TIFFs with ExtraSamples 0 or 1 [#10140] [@officialpm]
- Avoid repeated concatenation of GIF comments [#10143] [@radarhere]
- Do not change MicImageFile _n_frames or is_animated in TiffImageFile [#10142] [@radarhere]
- Require TIFF ColorMap length according to BitsPerSample [#10136] [@radarhere]
- Assign next PDF object ID in constant time [#10133] [@radarhere]
- Reject JPEG streams whose scanlines are wider or have more components [#10131] [@radarhere]
- XMP info will no longer be a tuple [#10077] [@radarhere]
- Return zero from ImagePath compact() if there are no points to remove [#10126] [@radarhere]
- Handle zero dimension images in RankFilter and related filters [#10130] [@radarhere]
- Raise an error when calling quantize() with an empty palette [#10129] [@radarhere]
- [pre-commit.ci] pre-commit autoupdate [#10128] [@pre-commit-ci[bot]]
- Set PdfParser default max_nesting limit to 900 [#10127] [@radarhere]
- Basic support for TSAN Docker builds [#10115] [@wiredfool]
- Prevent infinite loop when rewriting PDF pages [#10125] [@radarhere]
- Check COM marker length when encoding JPEG [#10124] [@radarhere]
- Delay creating APNG disposal frame until necessary [#10123] [@radarhere]
- Fix combining GIF frames when an earlier duration is missing [#10119] [@FanWu-ai]
- Limit WMF dimensions when loading to 0-65535 [#10120] [@radarhere]
- Fix use-after-free when a libtiff encode error occurs [#10117] [@radarhere]
- Do not keep size from failed GIF decompression bomb check [#10116] [@radarhere]
- Correct writing buffer to file in PyEncoder encode_to_file() [#10098] [@radarhere]
- Improve freeing objects on errors in PyImaging_GrabScreenWin32() [#10094] [@radarhere]
- Do not allow Ghostscript to render beyond decompression bomb limit [#10112] [@radarhere]
- Read XBM header line by line, instead of through regex [#10109] [@radarhere]
- Clear core image if mode or size has changed during seek() [#10105] [@radarhere]
- Do not use deprecated getdata [#9986] [@radarhere]
- Remove unused cleanup return value [#10101] [@radarhere]
- Raise OSError when TIFF tile size is unexpected [#10100] [@radarhere]
- Use set, rather than sorting list [#10099] [@radarhere]
- Fix PSD layer tiles reading from the wrong file offset [#10089] [@Arthur031221]
- Avoid unused object ids when saving PDF [#10091] [@Rodrigo-Palma]
- Raise an error if PDF page loop exists [#10093] [@radarhere]
- Return 0 or -1 from ImagingTransform() [#10075] [@radarhere]
- Transform EPS file name to an absolute path before invoking Ghostscript [#10090] [@radarhere]
- Fixed passing zero dimension images into fromarrow() [#10086] [@akx]
- Add decompression bomb check to grabclipboard() on Windows [#10078] [@radarhere]
- Add decompression bomb check after SPIDER seek [#10076] [@radarhere]
- Speed up and simplify GIF optimization [#10074] [@akx]
- Only replace a maximum of two Exif headers [#10073] [@radarhere]
- Use -O2 when building wheels for macOS and Linux [#10060] [@radarhere]
- Simplify code by removing instance variables [#10058] [@radarhere]
- Add pathlib support for font handling [#10053] [@hugovk]
- Clean up encoders deterministically on success and failure [#10043] [@danking]
- When saving an ICO frame without a matching size, use the next smallest provided image [#10051] [@Rodrigo-Palma]
- Remove conditionally-compiled or unreachable debug C code [#9915] [@akx]
- Fix OOB read in C getlist() and _putdata() when len overstates length [#9893] [@lazerg]
- When shrinking in ImageText wrap(), wrap text even if no scaling is required [#10025] [@radarhere]
- Restrict ImageWin Dib paste box to bitmap [#10040] [@radarhere]
- extra does not require a spare byte [#10046] [@radarhere]
- Use borrowed data when exporting an image created by Image.fromarrow [#9897] [@lazerg]
- Avoid overflow when multiplying integers in RankFilter [#10038] [@radarhere]
- Do not pad PNG palette when saving if bits is specified [#10029] [@aclark4life]
- Simplify code [#10031] [@radarhere]
- Do not treat RGB as a rawmode for an RGB palette [#10002] [@radarhere]
- Rearrange ImagingPoint code [#10026] [@radarhere]
- Use while loop in read_prev_trailer() to avoid RecursionError [#10023] [@radarhere]
- Allow zero-length members in tar files [#10014] [@hugovk]
- Raise ValueError if merging image32 images [#10022] [@radarhere]
- Correctly manage glyph when rendering font [#10020] [@radarhere]
- Return early when applying ImageMorph MorphOp to an empty image [#10021] [@radarhere]
- Do not decode more MSP data than necessary [#10019] [@radarhere]
- Use int64_t for y offset [#10017] [@radarhere]
- Do not decode more BMP data than necessary [#10015] [@radarhere]
- Raise error when creating ImagePalette with unsupported mode [#10013] [@radarhere]
- Apply hoist optimizations to Geometry.c's transforms [#9788] [@akx]
- Allow for IFDRational with negative numerator and zero denominator [#8970] [@radarhere]
- Offset to next TAR block must be positive [#10012] [@radarhere]
- Add decompression bomb checks after seek opens new format [#10011] [@radarhere]
- Raise OverflowError if text width goes below INT_MIN [#10010] [@radarhere]
- Cast before multiplying [#10009] [@radarhere]
- Simplify palette code [#10003] [@radarhere]
- Optimize histogram generation + fix masked histograms for 2-band images + add test coverage [#10005] [@akx]
- Add escape argument to PSDraw text method [#9996] [@lllleolin-max]
- Link FreeType against the bundled HarfBuzz in wheels [#9913] [@akx]
- Speed up some conversions [#9807] [@akx]
- Speed up
Image.getbbox(); fix it for I;16 modes [#9768] [@akx] - Apply restrict optimizations to ImagingQuantize's output loop [#10006] [@akx]
- Speed up
getpixel()andget_flattened_data()[#9881] [@akx] - Mark ImageFile._open() as abstract [#9876] [@radarhere]
- Return 0 or -1 from ImagingSplit(), rather than number of bands [#9988] [@radarhere]
- If height is scaled down significantly more than width, resize vertically first [#9549] [@radarhere]
- Compile less libtiff bits for wheels [#9970] [@akx]
- Preserve transparency when padding and expanding images [#9995] [@lllleolin-max]
- Move kernel size check into getlist() [#9987] [@radarhere]
PIL._binary: Useint.to_bytes()for faster conversion [#9981] [@akx]- Prevent negative ImageStat variance [#9994] [@lllleolin-max]
- Restore image position after an error in ImageSequence.all_frames() [#9999] [@niukanen1]
- Return palette contents in suitable format for C putpalette() [#9985] [@radarhere]
- Parenthesize
MIN/MAXmacro arguments [#9928] [@akx] - Add decompression bomb check when loading WmfStubImageFile at a different DPI [#9984] [@radarhere]
- Reject invalid radius in BoxBlur and GaussianBlur [#9983] [@radarhere]
- Fix ImageChops.offset for 16-bit modes + speed up [#9975] [@akx]
- Speed up
Image.filter()forI;16*[#9760] [@akx] - Fix cross-compiling by searching the right lib and include directories [#7634] [@chewi]
- Speed up
Image.offset[#9753] [@akx] - Remove duration and timestamp from AVIF info after seek [#9973] [@dylanpulver]
- Use lazy imports on Python 3.15 to improve startup speed [#9733] [@hugovk]
- [pre-commit.ci] pre-commit autoupdate [#9969] [@pre-commit-ci[bot]]
- Remove duration and timestamp from WebP info after seek [#9791] [@radarhere]
- If ICO image is smaller than (16, 16), save original size by default [#9766] [@radarhere]
- If reducing by a factor of 1, crop [#9959] [@radarhere]
- Inspect arg as Python object, instead of using PyErr_Clear() [#9726] [@radarhere]
- Copy palette when transforming PA images [#9965] [@radarhere]
- Treat FITS data as big-endian [#9575] [@radarhere]
- Correct error message for matrix length [#9956] [@radarhere]
- Copy qtables list when saving JPEG image [#9919] [@lazerg]
- Avoid integer overflow when calculating reduced image size [#9904] [@lazerg]
- Copy list-valued info entries independently in Image.copy() [#9964] [@lazerg]
- Avoid blocking all threads when decoding AVIF image [#9930] [@WillyJL]
- Use a critical section to protect getlist() [#9853] [@lazerg]
- Add GPSHPositioningError to GPS IFD tag data [#9941] [@dylanpulver]
- Use bytearray instead of BytesIO in MspDecoder [#9877] [@radarhere]
- Reject non-finite radius in BoxBlur [#9906] [@JonnasFigueiredo]
- Raise ValueError for truncated tRNS PNG chunks [#9934] [@VenishPaneliya]
- Adjust tuple construction in ImageGrab to fix mypy on macOS [#9935] [@akx]
- Add support for Magic Kernel Sharp resizing modes [#8811] [@drhead]
- Remove depends/install_raqm_cmake.sh; update FreeBSD instructions [#9927] [@akx]
- Fix comparison off-by-one in
getModeData/getRawModeData[#9932] [@akx] - Fix convert() from I;16N to I or F clipping 16-bit values [#9931] [@Kayvan-Zahiri]
- Mark StubHandler.open() as abstract [#9872] [@radarhere]
- Add strip_namespaces argument to Image.getxmp() [#9882] [@geeno16]
- Add _normalize_coords() to reduce duplicate code [#9899] [@radarhere]
- Rename IMAGING_TYPE_SPECIAL to IMAGING_TYPE_I16 [#9794] [@radarhere]
- Remove unnecessary check [#9874] [@radarhere]
- Improve reference handling in encode.c [#9920] [@radarhere]
- PySequence_Fast raises its own TypeError [#9921] [@radarhere]
- Import external headers with angle brackets [#9912] [@radarhere]
- Remove unused ImagingConvertInPlace [#9878] [@radarhere]
- Use GitHub's automerge instead of Mergify [#9126] [@hugovk]
- Rename C convert2 to convert_into [#9911] [@radarhere]
- PDF dictionary key must be a name [#9884] [@radarhere]
- Remove unused C convert method [#9910] [@radarhere]
- Do not open YCbCr colorspace images as RGB without libtiff [#9779] [@radarhere]
- Fix loading XPM images with transparency [#9848] [@nyxst4ck]
- Open BMP image with black palette in mode 1 [#9778] [@radarhere]
- Remove palette if no longer relevant after TIFF seek [#9855] [@radarhere]
- Add
mixed-line-endingto prek and convert to LF [#9886] [@hugovk] - Correct CmsProfile creation_date month [#9804] [@radarhere]
- Raise ValueError for truncated gAMA and cHRM PNG chunks [#9880] [@VenishPaneliya]
- Use PyErr_Format instead of sprintf [#9863] [@akx]
- Remove unneeded code for handling zero-width characters [#9875] [@radarhere]
- Simplify code to improve performance [#9860] [@hugovk]
- Move ImageCmsTransform mode check into C [#9793] [@radarhere]
- Save as RGB(A) when APNG frames have different palettes [#9870] [@DSeaStar]
- Simplified SPIDER code [#9823] [@radarhere]
- Use
fmt: skipinstead offmt: off/fmt: on[#9828] [@akx] - Reorder ImageMode tuples [#9808] [@radarhere]
- Handle zero dimensions in ImagingOffset [#9847] [@Mengxi-Xu]
- [pre-commit.ci] pre-commit autoupdate [#9843] [@pre-commit-ci[bot]]
- Derive PCX band count from the image, not the line width [#9798] [@chuenchen309]
- Fix BMP save of a P image with an empty palette [#9746] [@binggao1230]
- Do not read any further than necessary when decoding BMP images with RLE8 compression [#9824] [@radarhere]
- Fix unexpected errors when decoding truncated QOI images [#9813] [@abhi-0203]
- Raise ValueError instead of asserting ImageOps colorize() arguments [#9825] [@LuShadowX]
- Fix retrieving ImagePalette colors from raw palettes [#9821] [@nightcityblade]
- Treat an MPO with too few MP entries as a JPEG [#9826] [@LuShadowX]
- Use mode as default for C getpalette raw mode [#9822] [@radarhere]
- Raise SyntaxError instead of OverflowError for oversized JPEG 2000 box [#9818] [@nevercodecorrect]
- Raise UserWarning if TIFF tag offset too large [#9816] [@radarhere]
- Raise ValueError if Dib paste() box does not match image size [#9815] [@radarhere]
- Raise ValueError instead of asserting number of FTEX texture formats [#9805] [@ritsth]
- Handle premultiplied alpha modes in ImageColor.getcolor() [#9797] [@chuenchen309]
- Remove PIL_NO_INLINE and MSVC alias for inline [#9802] [@akx]
- Fix adding a new color when image palette has missing background or transparency index [#9799] [@chuenchen309]
- Correct background color when using P mode images with ImageOps.pad() [#9795] [@chuenchen309]
- Fix 16-bit ImageFilter accuracy [#9786] [@akx]
- Removed unused variable [#9789] [@radarhere]
- Remove unused PNG _OUTMODES [#9780] [@radarhere]
- Add support for Python 3.15 [#9776] [@hugovk]
- Fix RLE4 absolute mode decoding for odd pixel counts [#9710] [@nyxst4ck]
- Avoid divide-by-zero crash in RankFilter [#9755] [@lukegb]
- Port coveragerc to pyproject.toml; omit benchmarks from coverage [#9771] [@akx]
- Remove minimumReleaseAge for google/oss-fuzz [#9764] [@radarhere]
- Use ImagingNewDirty() in RankFilter and remove ImagingFill() in font.getmask() [#9744] [@akx]
- Remove Setuptools obsolete
zip_safeflag [#9758] [@hugovk] - Fix attach SBOM to GitHub release [#9748] [@hugovk]