Skip to content

Upgrading pillow 9 to 10

Breaking9.5.0 → 10.4.0Breaking3Security8Platform3Deprecated9New50Changed138Fixed81Other318

BreakingUpgrade verdict

3 breaking changes and 3 platform requirement changes and 8 security fixes.

  • Qt 5 is no longer supported; only newer Qt versions work.
  • The old way to measure text size with fonts is gone; use the newer text measurement methods instead.
  • APIs that were deprecated in earlier releases have now been removed.
  • Removes Python and NumPy version pinning on Cygwin.
Top 5 of 23 that need code or config changes

Python requirement changed in 10.0.0: >=3.7 → >=3.8.

Breaking3
Removes support for Qt 5.
Removes deprecated ImageFont.getsize and related functions for Pillow 10.0.0.
ImageFont.getsize
Removes deprecations scheduled for Pillow 10.0.0.
Security8
Fixes CVE-2024-28219 by using strncpy to avoid a buffer overflow.
strncpyMedium · CVSS 6.7
Restricts environment keys for ImageMath.eval().
ImageMath.eval()
Arbitrary Code Execution in Pillow
High · CVSS 8.1
libwebp: OOB write in BuildHuffmanTable
High · CVSS 8.8
Pillow versions before v10.0.1 bundled libwebp binaries in wheels that are vulnerable to CVE-2023-5129 (previously CVE-2023-4863). Pillow v10.0.1 upgrades the bundled libwebp binary to v1.3.2.
High · CVSS 8.8
Pillow versions before v10.0.1 bundled libwebp binaries in wheels that are vulnerable to CVE-2023-5129 (previously CVE-2023-4863). Pillow v10.0.1 upgrades the bundled libwebp binary to v1.3.2.
High · CVSS 8.8
Pillow versions before v10.0.1 bundled libwebp binaries in wheels that are vulnerable to CVE-2023-5129 (previously CVE-2023-4863). Pillow v10.0.1 upgrades the bundled libwebp binary to v1.3.2.
An issue was discovered in Pillow before 10.0.0. It is a Denial of Service that uncontrollably allocates memory to process a given task, potentially causing a service to crash by having it run out of memory. This occurs for truetype in ImageFont when textlength in an ImageDraw instance operates on a long text argument.
Platform3
Removes Python and NumPy version pinning on Cygwin.
NumPy
Drops support for soon end-of-life Python 3.7.
Replaces deprecated Py_FileSystemDefaultEncoding for Python 3.12 and later.
Py_FileSystemDefaultEncoding
Deprecated9
Deprecates non-image ImageCms modes.
ImageCms
Deprecates the ImageDraw.getdraw hints parameter.
ImageDraw.getdraw
Deprecates the BGR;15, BGR;16 and BGR;24 modes.
BGR;15BGR;16BGR;24
Deprecates support for libtiff versions below 4.
libtiff
Deprecates eval(), replacing it with lambda_eval() and unsafe_eval().
eval()lambda_eval()unsafe_eval()
Deprecates ImageCms constants and the versions() function.
ImageCmsversions()
Deprecates IptcImagePlugin helpers.
IptcImagePlugin
Translates encoder error codes to strings and deprecates ImageFile.raise_oserror().
ImageFile.raise_oserror()
Stops using CFFI access by default on PyPy.

Generated by DepDelta from published Python source. Not mixed with prose notes.

  • changed: constructor BdfFontFile(fp) → constructor BdfFontFile(fp: BinaryIO) -> None
  • changed: function bdf_char(f) → function bdf_char(f: BinaryIO) -> tuple[str, int, tuple[tuple[int, int], tuple[int, int, int, int], tuple[int, int, int, int]], Image.Image] | None
  • changed: function decode_dxt1(data, alpha=…) → function decode_dxt1(data: bytes, alpha: bool=…) -> tuple[bytearray, bytearray, bytearray, bytearray]
  • changed: function decode_dxt3(data) → function decode_dxt3(data: bytes) -> tuple[bytearray, bytearray, bytearray, bytearray]
  • changed: function decode_dxt5(data) → function decode_dxt5(data: bytes) -> tuple[bytearray, bytearray, bytearray, bytearray]
  • changed: function unpack_565(i) → function unpack_565(i: int) -> tuple[int, int, int]
  • changed: method BLPEncoder.encode(bufsize) → method BLPEncoder.encode(bufsize: int) -> tuple[int, int, bytes]
  • changed: method BmpRleDecoder.decode(buffer) → method BmpRleDecoder.decode(buffer: bytes) -> tuple[int, int]
  • changed: function register_handler(handler) → function register_handler(handler: ImageFile.StubHandler | None) -> None
  • changed: class ContainerIO → class ContainerIO(Generic[AnyStr])
  • changed: constructor ContainerIO(file, offset, length) → constructor ContainerIO(file: IO[AnyStr], offset: int, length: int) -> None
  • changed: method ContainerIO.isatty() → method ContainerIO.isatty() -> bool
  • changed: method ContainerIO.read(n=…) → method ContainerIO.read(n: int=…) -> AnyStr
  • changed: method ContainerIO.readline() → method ContainerIO.readline() -> AnyStr
  • changed: method ContainerIO.readlines() → method ContainerIO.readlines() -> list[AnyStr]
  • changed: method ContainerIO.seek(offset, mode=…) → method ContainerIO.seek(offset: int, mode: Literal[0, 1, 2]=…) -> None
  • changed: method ContainerIO.tell() → method ContainerIO.tell() -> int
  • changed: method DcxImageFile.seek(frame) → method DcxImageFile.seek(frame: int) -> None
  • changed: method DcxImageFile.tell() → method DcxImageFile.tell() -> int
  • removed: variable DDPF_ALPHA
  • removed: variable DDPF_ALPHAPIXELS
  • removed: variable DDPF_FOURCC
  • removed: variable DDPF_LUMINANCE
  • removed: variable DDPF_PALETTEINDEXED8
  • removed: variable DDPF_RGB
  • removed: variable DDSCAPS2_CUBEMAP
  • removed: variable DDSCAPS2_CUBEMAP_NEGATIVEX
  • removed: variable DDSCAPS2_CUBEMAP_NEGATIVEY
  • removed: variable DDSCAPS2_CUBEMAP_NEGATIVEZ
  • removed: variable DDSCAPS2_CUBEMAP_POSITIVEX
  • removed: variable DDSCAPS2_CUBEMAP_POSITIVEY
  • removed: variable DDSCAPS2_CUBEMAP_POSITIVEZ
  • removed: variable DDSCAPS2_VOLUME
  • removed: variable DDSCAPS_COMPLEX
  • removed: variable DDSCAPS_MIPMAP
  • removed: variable DDSCAPS_TEXTURE
  • removed: variable DDSD_CAPS
  • removed: variable DDSD_DEPTH
  • removed: variable DDSD_HEIGHT
  • removed: variable DDSD_LINEARSIZE
  • removed: variable DDSD_MIPMAPCOUNT
  • removed: variable DDSD_PITCH
  • removed: variable DDSD_PIXELFORMAT
  • removed: variable DDSD_WIDTH
  • changed: method DdsImageFile.load_seek(pos) → method DdsImageFile.load_seek(pos: int) -> None
  • added: class D3DFMT(IntEnum)
  • added: class DDPF(IntFlag)
  • added: class DDSCAPS(IntFlag)
  • added: class DDSCAPS2(IntFlag)
  • added: class DDSD(IntFlag)
  • added: class DXGI_FORMAT(IntEnum)
  • added: class DdsRgbDecoder(ImageFile.PyDecoder)
  • added: field D3DFMT.A1
  • added: field D3DFMT.A16B16G16R16
  • added: field D3DFMT.A16B16G16R16F
  • added: field D3DFMT.A1R5G5B5
  • added: field D3DFMT.A2B10G10R10
  • added: field D3DFMT.A2B10G10R10_XR_BIAS
  • added: field D3DFMT.A2R10G10B10
  • added: field D3DFMT.A2W10V10U10
  • added: field D3DFMT.A32B32G32R32F
  • added: field D3DFMT.A4L4
  • added: field D3DFMT.A4R4G4B4
  • added: field D3DFMT.A8
  • added: field D3DFMT.A8B8G8R8
  • added: field D3DFMT.A8L8
  • added: field D3DFMT.A8P8
  • added: field D3DFMT.A8R3G3B2
  • added: field D3DFMT.A8R8G8B8
  • added: field D3DFMT.ATI1
  • added: field D3DFMT.ATI2
  • added: field D3DFMT.BC4S
  • added: field D3DFMT.BC4U
  • added: field D3DFMT.BC5S
  • added: field D3DFMT.BC5U
  • added: field D3DFMT.BINARYBUFFER
  • added: field D3DFMT.CxV8U8
  • added: field D3DFMT.D15S1
  • added: field D3DFMT.D16
  • added: field D3DFMT.D16_LOCKABLE
  • added: field D3DFMT.D24FS8
  • added: field D3DFMT.D24S8
  • added: field D3DFMT.D24X4S4
  • added: field D3DFMT.D24X8
  • added: field D3DFMT.D32
  • added: field D3DFMT.D32F_LOCKABLE
  • added: field D3DFMT.D32_LOCKABLE
  • added: field D3DFMT.DX10
  • added: field D3DFMT.DXT1
  • added: field D3DFMT.DXT2
  • added: field D3DFMT.DXT3
  • added: field D3DFMT.DXT4
  • added: field D3DFMT.DXT5
  • added: field D3DFMT.G16R16
  • added: field D3DFMT.G16R16F
  • added: field D3DFMT.G32R32F
  • added: field D3DFMT.G8R8_G8B8
  • added: field D3DFMT.INDEX16
  • added: field D3DFMT.INDEX32
  • added: field D3DFMT.L16
  • added: field D3DFMT.L6V5U5
  • added: field D3DFMT.L8
  • added: field D3DFMT.MULTI2_ARGB8
  • added: field D3DFMT.P8
  • added: field D3DFMT.Q16W16V16U16
  • added: field D3DFMT.Q8W8V8U8
  • added: field D3DFMT.R16F
  • added: field D3DFMT.R32F
  • added: field D3DFMT.R3G3B2
  • added: field D3DFMT.R5G6B5
  • added: field D3DFMT.R8G8B8
  • added: field D3DFMT.R8G8_B8G8
  • added: field D3DFMT.S8_LOCKABLE
  • added: field D3DFMT.UNKNOWN
  • added: field D3DFMT.UYVY
  • added: field D3DFMT.V16U16
  • added: field D3DFMT.V8U8
  • added: field D3DFMT.VERTEXDATA
  • added: field D3DFMT.X1R5G5B5
  • added: field D3DFMT.X4R4G4B4
  • added: field D3DFMT.X8B8G8R8
  • added: field D3DFMT.X8L8V8U8
  • added: field D3DFMT.X8R8G8B8
  • added: field D3DFMT.YUY2
  • added: field DDPF.ALPHA
  • added: field DDPF.ALPHAPIXELS
  • added: field DDPF.FOURCC
  • added: field DDPF.LUMINANCE
  • added: field DDPF.PALETTEINDEXED8
  • added: field DDPF.RGB
  • added: field DDSCAPS.COMPLEX
  • added: field DDSCAPS.MIPMAP
  • added: field DDSCAPS.TEXTURE
  • added: field DDSCAPS2.CUBEMAP
  • added: field DDSCAPS2.CUBEMAP_NEGATIVEX
  • added: field DDSCAPS2.CUBEMAP_NEGATIVEY
  • added: field DDSCAPS2.CUBEMAP_NEGATIVEZ
  • added: field DDSCAPS2.CUBEMAP_POSITIVEX
  • added: field DDSCAPS2.CUBEMAP_POSITIVEY
  • added: field DDSCAPS2.CUBEMAP_POSITIVEZ
  • added: field DDSCAPS2.VOLUME
  • added: field DDSD.CAPS
  • added: field DDSD.DEPTH
  • added: field DDSD.HEIGHT
  • added: field DDSD.LINEARSIZE
  • added: field DDSD.MIPMAPCOUNT
  • added: field DDSD.PITCH
  • added: field DDSD.PIXELFORMAT
  • added: field DDSD.WIDTH
  • added: field DXGI_FORMAT.A8P8
  • added: field DXGI_FORMAT.A8_UNORM
  • added: field DXGI_FORMAT.AI44
  • added: field DXGI_FORMAT.AYUV
  • added: field DXGI_FORMAT.B4G4R4A4_UNORM
  • added: field DXGI_FORMAT.B5G5R5A1_UNORM
  • added: field DXGI_FORMAT.B5G6R5_UNORM
  • added: field DXGI_FORMAT.B8G8R8A8_TYPELESS
  • added: field DXGI_FORMAT.B8G8R8A8_UNORM
  • added: field DXGI_FORMAT.B8G8R8A8_UNORM_SRGB
  • added: field DXGI_FORMAT.B8G8R8X8_TYPELESS
  • added: field DXGI_FORMAT.B8G8R8X8_UNORM
  • added: field DXGI_FORMAT.B8G8R8X8_UNORM_SRGB
  • added: field DXGI_FORMAT.BC1_TYPELESS
  • added: field DXGI_FORMAT.BC1_UNORM
  • added: field DXGI_FORMAT.BC1_UNORM_SRGB
  • added: field DXGI_FORMAT.BC2_TYPELESS
  • added: field DXGI_FORMAT.BC2_UNORM
  • added: field DXGI_FORMAT.BC2_UNORM_SRGB
  • added: field DXGI_FORMAT.BC3_TYPELESS
  • added: field DXGI_FORMAT.BC3_UNORM
  • added: field DXGI_FORMAT.BC3_UNORM_SRGB
  • added: field DXGI_FORMAT.BC4_SNORM
  • added: field DXGI_FORMAT.BC4_TYPELESS
  • added: field DXGI_FORMAT.BC4_UNORM
  • added: field DXGI_FORMAT.BC5_SNORM
  • added: field DXGI_FORMAT.BC5_TYPELESS
  • added: field DXGI_FORMAT.BC5_UNORM
  • added: field DXGI_FORMAT.BC6H_SF16
  • added: field DXGI_FORMAT.BC6H_TYPELESS
  • added: field DXGI_FORMAT.BC6H_UF16
  • added: field DXGI_FORMAT.BC7_TYPELESS
  • added: field DXGI_FORMAT.BC7_UNORM
  • added: field DXGI_FORMAT.BC7_UNORM_SRGB
  • added: field DXGI_FORMAT.D16_UNORM
  • added: field DXGI_FORMAT.D24_UNORM_S8_UINT
  • added: field DXGI_FORMAT.D32_FLOAT
  • added: field DXGI_FORMAT.D32_FLOAT_S8X24_UINT
  • added: field DXGI_FORMAT.G8R8_G8B8_UNORM
  • added: field DXGI_FORMAT.IA44
  • added: field DXGI_FORMAT.NV11
  • added: field DXGI_FORMAT.NV12
  • added: field DXGI_FORMAT.OPAQUE_420
  • added: field DXGI_FORMAT.P010
  • added: field DXGI_FORMAT.P016
  • added: field DXGI_FORMAT.P208
  • added: field DXGI_FORMAT.P8
  • added: field DXGI_FORMAT.R10G10B10A2_TYPELESS
  • added: field DXGI_FORMAT.R10G10B10A2_UINT
  • added: field DXGI_FORMAT.R10G10B10A2_UNORM
  • added: field DXGI_FORMAT.R10G10B10_XR_BIAS_A2_UNORM
  • added: field DXGI_FORMAT.R11G11B10_FLOAT
  • added: field DXGI_FORMAT.R16G16B16A16_FLOAT
  • added: field DXGI_FORMAT.R16G16B16A16_SINT
  • added: field DXGI_FORMAT.R16G16B16A16_SNORM
  • added: field DXGI_FORMAT.R16G16B16A16_TYPELESS
  • added: field DXGI_FORMAT.R16G16B16A16_UINT
  • added: field DXGI_FORMAT.R16G16B16A16_UNORM
  • added: field DXGI_FORMAT.R16G16_FLOAT
  • added: field DXGI_FORMAT.R16G16_SINT
  • added: field DXGI_FORMAT.R16G16_SNORM
  • added: field DXGI_FORMAT.R16G16_TYPELESS
  • added: field DXGI_FORMAT.R16G16_UINT
  • added: field DXGI_FORMAT.R16G16_UNORM
  • added: field DXGI_FORMAT.R16_FLOAT
  • added: field DXGI_FORMAT.R16_SINT
  • added: field DXGI_FORMAT.R16_SNORM
  • added: field DXGI_FORMAT.R16_TYPELESS
  • added: field DXGI_FORMAT.R16_UINT
  • added: field DXGI_FORMAT.R16_UNORM
  • added: field DXGI_FORMAT.R1_UNORM
  • added: field DXGI_FORMAT.R24G8_TYPELESS
  • added: field DXGI_FORMAT.R24_UNORM_X8_TYPELESS
  • added: field DXGI_FORMAT.R32G32B32A32_FLOAT
  • added: field DXGI_FORMAT.R32G32B32A32_SINT
  • added: field DXGI_FORMAT.R32G32B32A32_TYPELESS
  • added: field DXGI_FORMAT.R32G32B32A32_UINT
  • added: field DXGI_FORMAT.R32G32B32_FLOAT
  • added: field DXGI_FORMAT.R32G32B32_SINT
  • added: field DXGI_FORMAT.R32G32B32_TYPELESS
  • added: field DXGI_FORMAT.R32G32B32_UINT
  • added: field DXGI_FORMAT.R32G32_FLOAT
  • added: field DXGI_FORMAT.R32G32_SINT
  • added: field DXGI_FORMAT.R32G32_TYPELESS
  • added: field DXGI_FORMAT.R32G32_UINT
  • added: field DXGI_FORMAT.R32G8X24_TYPELESS
  • added: field DXGI_FORMAT.R32_FLOAT
  • added: field DXGI_FORMAT.R32_FLOAT_X8X24_TYPELESS
  • added: field DXGI_FORMAT.R32_SINT
  • added: field DXGI_FORMAT.R32_TYPELESS
  • added: field DXGI_FORMAT.R32_UINT
  • added: field DXGI_FORMAT.R8G8B8A8_SINT
  • added: field DXGI_FORMAT.R8G8B8A8_SNORM
  • added: field DXGI_FORMAT.R8G8B8A8_TYPELESS
  • added: field DXGI_FORMAT.R8G8B8A8_UINT
  • added: field DXGI_FORMAT.R8G8B8A8_UNORM
  • added: field DXGI_FORMAT.R8G8B8A8_UNORM_SRGB
  • added: field DXGI_FORMAT.R8G8_B8G8_UNORM
  • added: field DXGI_FORMAT.R8G8_SINT
  • added: field DXGI_FORMAT.R8G8_SNORM
  • added: field DXGI_FORMAT.R8G8_TYPELESS
  • added: field DXGI_FORMAT.R8G8_UINT
  • added: field DXGI_FORMAT.R8G8_UNORM
  • added: field DXGI_FORMAT.R8_SINT
  • added: field DXGI_FORMAT.R8_SNORM
  • added: field DXGI_FORMAT.R8_TYPELESS
  • added: field DXGI_FORMAT.R8_UINT
  • added: field DXGI_FORMAT.R8_UNORM
  • added: field DXGI_FORMAT.R9G9B9E5_SHAREDEXP
  • added: field DXGI_FORMAT.SAMPLER_FEEDBACK_MIN_MIP_OPAQUE
  • added: field DXGI_FORMAT.SAMPLER_FEEDBACK_MIP_REGION_USED_OPAQUE
  • added: field DXGI_FORMAT.UNKNOWN
  • added: field DXGI_FORMAT.V208
  • added: field DXGI_FORMAT.V408
  • added: field DXGI_FORMAT.X24_TYPELESS_G8_UINT
  • added: field DXGI_FORMAT.X32_TYPELESS_G8X24_UINT
  • added: field DXGI_FORMAT.Y210
  • added: field DXGI_FORMAT.Y216
  • added: field DXGI_FORMAT.Y410
  • added: field DXGI_FORMAT.Y416
  • added: field DXGI_FORMAT.YUY2
  • added: method DdsRgbDecoder.decode(buffer: bytes) -> tuple[int, int]
  • added: variable module
  • changed: function has_ghostscript() → function has_ghostscript() -> bool
  • changed: method EpsImageFile.load_seek(*args, **kwargs) → method EpsImageFile.load_seek(pos: int) -> None
  • changed: method PSFile.readline() → method PSFile.readline() -> str
  • added: variable gs_binary: str | bool | None
  • removed: field Interop.RleatedImageHeight
  • added: field Interop.RelatedImageHeight
  • added: class FitsGzipDecoder(ImageFile.PyDecoder)
  • added: method FitsGzipDecoder.decode(buffer: bytes) -> tuple[int, int]
  • removed: class FITSStubImageFile(ImageFile.StubImageFile)
  • removed: field FITSStubImageFile.format
  • removed: field FITSStubImageFile.format_description
  • removed: function register_handler(handler)
  • changed: method FliImageFile.seek(frame) → method FliImageFile.seek(frame: int) -> None
  • changed: method FliImageFile.tell() → method FliImageFile.tell() -> int
  • changed: constructor FontFile() → constructor FontFile() -> None
  • changed: field FontFile.bitmap → field FontFile.bitmap: Image.Image | None
  • changed: function puti16(fp, values) → function puti16(fp: BinaryIO, values: tuple[int, int, int, int, int, int, int, int, int, int]) -> None
  • changed: method FontFile.compile() → method FontFile.compile() -> None
  • changed: method FontFile.save(filename) → method FontFile.save(filename: str) -> None
  • changed: method FpxImageFile.close() → method FpxImageFile.close() -> None
  • changed: method FtexImageFile.load_seek(pos) → method FtexImageFile.load_seek(pos: int) -> None
  • changed: function open(fp, mode=…) → function open(fp: StrOrBytesPath | IO[bytes], mode: str=…) -> GdImageFile
  • removed: property GifImageFile.is_animated
  • removed: property GifImageFile.n_frames
  • changed: function get_interlace(im) → function get_interlace(im: Image.Image) -> int
  • changed: function getdata(im, offset=…, **params) → function getdata(im: Image.Image, offset: tuple[int, int]=…, **params: Any) -> list[bytes]
  • changed: function getheader(im, palette=…, info=…) → function getheader(im: Image.Image, palette: _Palette | None=…, info: dict[str, Any] | None=…) -> tuple[list[bytes], list[int] | None]
  • changed: method GifImageFile.data() → method GifImageFile.data() -> bytes | None
  • changed: method GifImageFile.load_end() → method GifImageFile.load_end() -> None
  • changed: method GifImageFile.load_prepare() → method GifImageFile.load_prepare() -> None
  • changed: method GifImageFile.seek(frame) → method GifImageFile.seek(frame: int) -> None
  • changed: method GifImageFile.tell() → method GifImageFile.tell() -> int
  • added: property GifImageFile.is_animated -> bool
  • added: property GifImageFile.n_frames -> int
  • changed: constructor GimpGradientFile(fp) → constructor GimpGradientFile(fp: IO[bytes]) -> None
  • changed: field GradientFile.gradient → field GradientFile.gradient: list[tuple[float, float, float, list[float], list[float], Callable[[float, float], float]]] | None
  • changed: function curved(middle, pos) → function curved(middle: float, pos: float) -> float
  • changed: function linear(middle, pos) → function linear(middle: float, pos: float) -> float
  • changed: function sine(middle, pos) → function sine(middle: float, pos: float) -> float
  • changed: function sphere_decreasing(middle, pos) → function sphere_decreasing(middle: float, pos: float) -> float
  • changed: function sphere_increasing(middle, pos) → function sphere_increasing(middle: float, pos: float) -> float
  • changed: method GradientFile.getpalette(entries=…) → method GradientFile.getpalette(entries: int=…) -> tuple[bytes, str]
  • changed: constructor GimpPaletteFile(fp) → constructor GimpPaletteFile(fp: IO[bytes]) -> None
  • changed: method GimpPaletteFile.getpalette() → method GimpPaletteFile.getpalette() -> tuple[bytes, str]
  • changed: function register_handler(handler) → function register_handler(handler: ImageFile.StubHandler | None) -> None
  • changed: function register_handler(handler) → function register_handler(handler: ImageFile.StubHandler | None) -> None
  • changed: method IcoFile.frame(idx) → method IcoFile.frame(idx: int) -> Image.Image
  • changed: method IcoImageFile.load_seek() → method IcoImageFile.load_seek(pos: int) -> None
  • removed: property ImImageFile.is_animated
  • removed: property ImImageFile.n_frames
  • changed: function number(s) → function number(s: Any) -> float
  • changed: method ImImageFile.seek(frame) → method ImImageFile.seek(frame: int) -> None
  • changed: method ImImageFile.tell() → method ImImageFile.tell() -> int
  • added: property ImImageFile.is_animated -> bool
  • added: property ImImageFile.n_frames -> int
  • removed: function coerce_e(value)
  • removed: property Image.height
  • removed: property Image.size
  • removed: property Image.width
  • changed: class Exif(MutableMapping) → class Exif(_ExifBase)
  • changed: field Image.format → field Image.format: str | None
  • changed: field Image.format_description → field Image.format_description: str | None
  • changed: function alpha_composite(im1, im2) → function alpha_composite(im1: Image, im2: Image) -> Image
  • changed: function blend(im1, im2, alpha) → function blend(im1: Image, im2: Image, alpha: float) -> Image
  • changed: function composite(image1, image2, mask) → function composite(image1: Image, image2: Image, mask: Image) -> Image
  • changed: function effect_mandelbrot(size, extent, quality) → function effect_mandelbrot(size: tuple[int, int], extent: tuple[float, float, float, float], quality: int) -> Image
  • changed: function effect_noise(size, sigma) → function effect_noise(size: tuple[int, int], sigma: float) -> Image
  • changed: function fromarray(obj, mode=…) → function fromarray(obj: SupportsArrayInterface, mode: str | None=…) -> Image
  • changed: function frombuffer(mode, size, data, decoder_name=…, *args) → function frombuffer(mode: str, size: tuple[int, int], data, decoder_name: str=…, *args: Any) -> Image
  • changed: function frombytes(mode, size, data, decoder_name=…, *args) → function frombytes(mode: str, size: tuple[int, int], data: bytes | bytearray, decoder_name: str=…, *args: Any) -> Image
  • changed: function getmodebandnames(mode) → function getmodebandnames(mode: str) -> tuple[str, ...]
  • changed: function getmodebands(mode) → function getmodebands(mode: str) -> int
  • changed: function getmodebase(mode) → function getmodebase(mode: str) -> str
  • changed: function getmodetype(mode) → function getmodetype(mode: str) -> str
  • changed: function init() → function init() -> bool
  • changed: function isImageType(t) → function isImageType(t: Any) -> TypeGuard[Image]
  • changed: function linear_gradient(mode) → function linear_gradient(mode: str) -> Image
  • changed: function merge(mode, bands) → function merge(mode: str, bands: Sequence[Image]) -> Image
  • changed: function new(mode, size, color=…) → function new(mode: str, size: tuple[int, int] | list[int], color: float | tuple[float, ...] | str | None=…) -> Image
  • changed: function open(fp, mode=…, formats=…) → function open(fp: StrOrBytesPath | IO[bytes], mode: Literal['r']=…, formats: list[str] | tuple[str, ...] | None=…) -> ImageFile.ImageFile
  • changed: function preinit() → function preinit() -> None
  • changed: function radial_gradient(mode) → function radial_gradient(mode: str) -> Image
  • changed: function register_decoder(name, decoder) → function register_decoder(name: str, decoder: type[ImageFile.PyDecoder]) -> None
  • changed: function register_encoder(name, encoder) → function register_encoder(name: str, encoder: type[ImageFile.PyEncoder]) -> None
  • changed: function register_extension(id, extension) → function register_extension(id: str, extension: str) -> None
  • changed: function register_extensions(id, extensions) → function register_extensions(id: str, extensions: list[str]) -> None
  • changed: function register_mime(id, mimetype) → function register_mime(id: str, mimetype: str) -> None
  • changed: function register_open(id, factory, accept=…) → function register_open(id: str, factory: Callable[[IO[bytes], str | bytes], ImageFile.ImageFile], accept: Callable[[bytes], bool | str] | None=…) -> None
  • changed: function register_save(id, driver) → function register_save(id: str, driver: Callable[[Image, IO[bytes], str | bytes], None]) -> None
  • changed: function register_save_all(id, driver) → function register_save_all(id: str, driver: Callable[[Image, IO[bytes], str | bytes], None]) -> None
  • changed: function registered_extensions() → function registered_extensions() -> dict[str, str]
  • changed: method Exif.hide_offsets() → method Exif.hide_offsets() -> None
  • changed: method Exif.tobytes(offset=…) → method Exif.tobytes(offset: int=…) -> bytes
  • changed: method Image.alpha_composite(im, dest=…, source=…) → method Image.alpha_composite(im: Image, dest: Sequence[int]=…, source: Sequence[int]=…) -> None
  • changed: method Image.apply_transparency() → method Image.apply_transparency() -> None
  • changed: method Image.close() → method Image.close() -> None
  • changed: method Image.convert(mode=…, matrix=…, dither=…, palette=…, colors=…) → method Image.convert(mode: str | None=…, matrix: tuple[float, ...] | None=…, dither: Dither | None=…, palette: Palette=…, colors: int=…) -> Image
  • changed: method Image.copy() → method Image.copy() -> Image
  • changed: method Image.crop(box=…) → method Image.crop(box: tuple[float, float, float, float] | None=…) -> Image
  • changed: method Image.draft(mode, size) → method Image.draft(mode: str | None, size: tuple[int, int] | None) -> tuple[str, tuple[int, int, float, float]] | None
  • changed: method Image.effect_spread(distance) → method Image.effect_spread(distance: int) -> Image
  • changed: method Image.filter(filter) → method Image.filter(filter: ImageFilter.Filter | type[ImageFilter.Filter]) -> Image
  • changed: method Image.frombytes(data, decoder_name=…, *args) → method Image.frombytes(data: bytes | bytearray, decoder_name: str=…, *args: Any) -> None
  • changed: method Image.get_child_images() → method Image.get_child_images() -> list[ImageFile.ImageFile]
  • changed: method Image.getbands() → method Image.getbands() -> tuple[str, ...]
  • changed: method Image.getbbox() → method Image.getbbox(*, alpha_only: bool=…) -> tuple[int, int, int, int] | None
  • changed: method Image.getchannel(channel) → method Image.getchannel(channel: int | str) -> Image
  • changed: method Image.getcolors(maxcolors=…) → method Image.getcolors(maxcolors: int=…)
  • changed: method Image.getdata(band=…) → method Image.getdata(band: int | None=…)
  • changed: method Image.getexif() → method Image.getexif() -> Exif
  • changed: method Image.getextrema() → method Image.getextrema() -> tuple[float, float] | tuple[tuple[int, int], ...]
  • changed: method Image.getpalette(rawmode=…) → method Image.getpalette(rawmode: str | None=…) -> list[int] | None
  • changed: method Image.getpixel(xy) → method Image.getpixel(xy: tuple[int, int] | list[int]) -> float | tuple[int, ...] | None
  • changed: method Image.getprojection() → method Image.getprojection() -> tuple[list[int], list[int]]
  • changed: method Image.histogram(mask=…, extrema=…) → method Image.histogram(mask: Image | None=…, extrema=…) -> list[int]
  • changed: method Image.load() → method Image.load() -> core.PixelAccess | PyAccess.PyAccess | None
  • changed: method Image.paste(im, box=…, mask=…) → method Image.paste(im: Image | str | float | tuple[float, ...], box: Image | tuple[int, int, int, int] | tuple[int, int] | None=…, mask: Image | None=…) -> None
  • changed: method Image.point(lut, mode=…) → method Image.point(lut: Sequence[float] | Callable[[int], float] | ImagePointHandler, mode: str | None=…) -> Image
  • changed: method Image.putalpha(alpha) → method Image.putalpha(alpha: Image | int) -> None
  • changed: method Image.putdata(data, scale=…, offset=…) → method Image.putdata(data: Sequence[float] | Sequence[Sequence[int]], scale: float=…, offset: float=…) -> None
  • changed: method Image.putpalette(data, rawmode=…) → method Image.putpalette(data, rawmode=…) -> None
  • changed: method Image.putpixel(xy, value) → method Image.putpixel(xy: tuple[int, int], value: float | tuple[int, ...] | list[int]) -> None
  • changed: method Image.quantize(colors=…, method=…, kmeans=…, palette=…, dither=…) → method Image.quantize(colors: int=…, method: int | None=…, kmeans: int=…, palette=…, dither: Dither=…) -> Image
  • changed: method Image.reduce(factor, box=…) → method Image.reduce(factor: int | tuple[int, int], box: tuple[int, int, int, int] | None=…) -> Image
  • changed: method Image.resize(size, resample=…, box=…, reducing_gap=…) → method Image.resize(size: tuple[int, int], resample: int | None=…, box: tuple[float, float, float, float] | None=…, reducing_gap: float | None=…) -> Image
  • changed: method Image.rotate(angle, resample=…, expand=…, center=…, translate=…, fillcolor=…) → method Image.rotate(angle: float, resample: Resampling=…, expand: int | bool=…, center: tuple[float, float] | None=…, translate: tuple[int, int] | None=…, fillcolor: float | tuple[float, ...] | str | None=…) -> Image
  • changed: method Image.save(fp, format=…, **params) → method Image.save(fp: StrOrBytesPath | IO[bytes], format: str | None=…, **params: Any) -> None
  • changed: method Image.seek(frame) → method Image.seek(frame: int) -> None
  • changed: method Image.show(title=…) → method Image.show(title: str | None=…) -> None
  • changed: method Image.split() → method Image.split() -> tuple[Image, ...]
  • changed: method Image.tell() → method Image.tell() -> int
  • changed: method Image.thumbnail(size, resample=…, reducing_gap=…) → method Image.thumbnail(size: tuple[float, float], resample: Resampling=…, reducing_gap: float | None=…) -> None
  • changed: method Image.tobitmap(name=…) → method Image.tobitmap(name: str=…) -> bytes
  • changed: method Image.tobytes(encoder_name=…, *args) → method Image.tobytes(encoder_name: str=…, *args: Any) -> bytes
  • changed: method Image.transform(size, method, data=…, resample=…, fill=…, fillcolor=…) → method Image.transform(size: tuple[int, int], method: Transform | ImageTransformHandler | SupportsGetData, data: Sequence[Any] | None=…, resample: int=…, fill: int=…, fillcolor: float | tuple[float, ...] | str | None=…) -> Image
  • changed: method Image.transpose(method) → method Image.transpose(method: Transpose) -> Image
  • changed: method Image.verify() → method Image.verify() -> None
  • changed: variable DECODERS → variable DECODERS: dict[str, type[ImageFile.PyDecoder]]
  • changed: variable ENCODERS → variable ENCODERS: dict[str, type[ImageFile.PyEncoder]]
  • changed: variable EXTENSION → variable EXTENSION: dict[str, str]
  • changed: variable ID → variable ID: list[str]
  • changed: variable MAX_IMAGE_PIXELS → variable MAX_IMAGE_PIXELS: int | None
  • changed: variable MIME → variable MIME: dict[str, str]
  • changed: variable OPEN → variable OPEN: dict[str, tuple[Callable[[IO[bytes], str | bytes], ImageFile.ImageFile], Callable[[bytes], bool | str] | None]]
  • changed: variable SAVE → variable SAVE: dict[str, Callable[[Image, IO[bytes], str | bytes], None]]
  • changed: variable SAVE_ALL → variable SAVE_ALL: dict[str, Callable[[Image, IO[bytes], str | bytes], None]]
  • added: class SupportsArrayInterface(Protocol)
  • added: class SupportsGetData(Protocol)
  • added: method Image.getxmp()
  • added: method ImagePointHandler.point(im: Image) -> Image
  • added: method ImageTransformHandler.transform(size: tuple[int, int], image: Image, **options: Any) -> Image
  • added: method SupportsGetData.getdata() -> tuple[Transform, Sequence[int]]
  • added: property Image.has_transparency_data -> bool
  • added: property Image.height -> int
  • added: property Image.mode -> str
  • added: property Image.size -> tuple[int, int]
  • added: property Image.width -> int
  • added: variable ElementTree: ModuleType | None
  • added: variable WARN_POSSIBLE_FORMATS: bool
  • added: variable cffi: ModuleType | None
  • changed: function add(image1, image2, scale=…, offset=…) → function add(image1: Image.Image, image2: Image.Image, scale: float=…, offset: float=…) -> Image.Image
  • changed: function add_modulo(image1, image2) → function add_modulo(image1: Image.Image, image2: Image.Image) -> Image.Image
  • changed: function blend(image1, image2, alpha) → function blend(image1: Image.Image, image2: Image.Image, alpha: float) -> Image.Image
  • changed: function composite(image1, image2, mask) → function composite(image1: Image.Image, image2: Image.Image, mask: Image.Image) -> Image.Image
  • changed: function constant(image, value) → function constant(image: Image.Image, value: int) -> Image.Image
  • changed: function darker(image1, image2) → function darker(image1: Image.Image, image2: Image.Image) -> Image.Image
  • changed: function difference(image1, image2) → function difference(image1: Image.Image, image2: Image.Image) -> Image.Image
  • changed: function duplicate(image) → function duplicate(image: Image.Image) -> Image.Image
  • changed: function hard_light(image1, image2) → function hard_light(image1: Image.Image, image2: Image.Image) -> Image.Image
  • changed: function invert(image) → function invert(image: Image.Image) -> Image.Image
  • changed: function lighter(image1, image2) → function lighter(image1: Image.Image, image2: Image.Image) -> Image.Image
  • changed: function logical_and(image1, image2) → function logical_and(image1: Image.Image, image2: Image.Image) -> Image.Image
  • changed: function logical_or(image1, image2) → function logical_or(image1: Image.Image, image2: Image.Image) -> Image.Image
  • changed: function logical_xor(image1, image2) → function logical_xor(image1: Image.Image, image2: Image.Image) -> Image.Image
  • changed: function multiply(image1, image2) → function multiply(image1: Image.Image, image2: Image.Image) -> Image.Image
  • changed: function offset(image, xoffset, yoffset=…) → function offset(image: Image.Image, xoffset: int, yoffset: int | None=…) -> Image.Image
  • changed: function overlay(image1, image2) → function overlay(image1: Image.Image, image2: Image.Image) -> Image.Image
  • changed: function screen(image1, image2) → function screen(image1: Image.Image, image2: Image.Image) -> Image.Image
  • changed: function soft_light(image1, image2) → function soft_light(image1: Image.Image, image2: Image.Image) -> Image.Image
  • changed: function subtract(image1, image2, scale=…, offset=…) → function subtract(image1: Image.Image, image2: Image.Image, scale: float=…, offset: float=…) -> Image.Image
  • changed: function subtract_modulo(image1, image2) → function subtract_modulo(image1: Image.Image, image2: Image.Image) -> Image.Image
  • removed: variable DESCRIPTION
  • removed: variable FLAGS
  • removed: variable VERSION
  • changed: constructor ImageCmsProfile(profile) → constructor ImageCmsProfile(profile: str | SupportsRead[bytes] | core.CmsProfile) -> None
  • changed: constructor ImageCmsTransform(input, output, input_mode, output_mode, intent=…, proof=…, proof_intent=…, flags=…) → constructor ImageCmsTransform(input: ImageCmsProfile, output: ImageCmsProfile, input_mode: str, output_mode: str, intent: Intent=…, proof: ImageCmsProfile | None=…, proof_intent: Intent=…, flags: Flags=…)
  • changed: function applyTransform(im, transform, inPlace=…) → function applyTransform(im: Image.Image, transform: ImageCmsTransform, inPlace: bool=…) -> Image.Image | None
  • changed: function buildProofTransform(inputProfile, outputProfile, proofProfile, inMode, outMode, renderingIntent=…, proofRenderingIntent=…, flags=…) → function buildProofTransform(inputProfile: _CmsProfileCompatible, outputProfile: _CmsProfileCompatible, proofProfile: _CmsProfileCompatible, inMode: str, outMode: str, renderingIntent: Intent=…, proofRenderingIntent: Intent=…, flags: Flags=…) -> ImageCmsTransform
  • changed: function buildTransform(inputProfile, outputProfile, inMode, outMode, renderingIntent=…, flags=…) → function buildTransform(inputProfile: _CmsProfileCompatible, outputProfile: _CmsProfileCompatible, inMode: str, outMode: str, renderingIntent: Intent=…, flags: Flags=…) -> ImageCmsTransform
  • changed: function createProfile(colorSpace, colorTemp=…) → function createProfile(colorSpace: Literal['LAB', 'XYZ', 'sRGB'], colorTemp: SupportsFloat=…) -> core.CmsProfile
  • changed: function getDefaultIntent(profile) → function getDefaultIntent(profile: _CmsProfileCompatible) -> int
  • changed: function getOpenProfile(profileFilename) → function getOpenProfile(profileFilename: str | SupportsRead[bytes] | core.CmsProfile) -> ImageCmsProfile
  • changed: function getProfileCopyright(profile) → function getProfileCopyright(profile: _CmsProfileCompatible) -> str
  • changed: function getProfileDescription(profile) → function getProfileDescription(profile: _CmsProfileCompatible) -> str
  • changed: function getProfileInfo(profile) → function getProfileInfo(profile: _CmsProfileCompatible) -> str
  • changed: function getProfileManufacturer(profile) → function getProfileManufacturer(profile: _CmsProfileCompatible) -> str
  • changed: function getProfileModel(profile) → function getProfileModel(profile: _CmsProfileCompatible) -> str
  • changed: function getProfileName(profile) → function getProfileName(profile: _CmsProfileCompatible) -> str
  • changed: function get_display_profile(handle=…) → function get_display_profile(handle: SupportsInt | None=…) -> ImageCmsProfile | None
  • changed: function isIntentSupported(profile, intent, direction) → function isIntentSupported(profile: _CmsProfileCompatible, intent: Intent, direction: Direction) -> Literal[-1, 1]
  • changed: function profileToProfile(im, inputProfile, outputProfile, renderingIntent=…, outputMode=…, inPlace=…, flags=…) → function profileToProfile(im: Image.Image, inputProfile: _CmsProfileCompatible, outputProfile: _CmsProfileCompatible, renderingIntent: Intent=…, outputMode: str | None=…, inPlace: bool=…, flags: Flags=…) -> Image.Image | None
  • changed: function versions() → function versions() -> tuple[str, str | None, str, str]
  • changed: method ImageCmsProfile.tobytes() → method ImageCmsProfile.tobytes() -> bytes
  • changed: method ImageCmsTransform.apply(im, imOut=…) → method ImageCmsTransform.apply(im: Image.Image, imOut: Image.Image | None=…) -> Image.Image
  • changed: method ImageCmsTransform.apply_in_place(im) → method ImageCmsTransform.apply_in_place(im: Image.Image) -> Image.Image
  • changed: method ImageCmsTransform.point(im) → method ImageCmsTransform.point(im: Image.Image) -> Image.Image
  • added: class Flags(IntFlag)
  • added: field Flags.BLACKPOINTCOMPENSATION
  • added: field Flags.CLUT_POST_LINEARIZATION
  • added: field Flags.CLUT_PRE_LINEARIZATION
  • added: field Flags.COPY_ALPHA
  • added: field Flags.FORCE_CLUT
  • added: field Flags.GAMUTCHECK
  • added: field Flags.GUESSDEVICECLASS
  • added: field Flags.HIGHRESPRECALC
  • added: field Flags.KEEP_SEQUENCE
  • added: field Flags.LOWRESPRECALC
  • added: field Flags.NOCACHE
  • added: field Flags.NODEFAULTRESOURCEDEF
  • added: field Flags.NONE
  • added: field Flags.NONEGATIVES
  • added: field Flags.NOOPTIMIZE
  • added: field Flags.NOWHITEONWHITEFIXUP
  • added: field Flags.NULLTRANSFORM
  • added: field Flags.SOFTPROOFING
  • added: field Flags.USE_8BITS_DEVICELINK
  • added: static method Flags.GRIDPOINTS(n: int) -> Flags
  • changed: function getcolor(color, mode) → function getcolor(color: str, mode: str) -> int | tuple[int, ...]
  • changed: function getrgb(color) → function getrgb(color: str) -> tuple[int, int, int] | tuple[int, int, int, int]
  • changed: variable colormap → variable colormap: dict[str, str | tuple[int, int, int]]
  • removed: method ImageDraw.multiline_textsize(text, font=…, spacing=…, direction=…, features=…, language=…, stroke_width=…)
  • removed: method ImageDraw.textsize(text, font=…, spacing=…, direction=…, features=…, language=…, stroke_width=…)
  • changed: constructor ImageDraw(im, mode=…) → constructor ImageDraw(im: Image.Image, mode: str | None=…) -> None
  • changed: field ImageDraw.font → field ImageDraw.font: ImageFont.ImageFont | ImageFont.FreeTypeFont | ImageFont.TransposedFont | None
  • changed: function Draw(im, mode=…) → function Draw(im: Image.Image, mode: str | None=…) -> ImageDraw
  • changed: function floodfill(image, xy, value, border=…, thresh=…) → function floodfill(image: Image.Image, xy: tuple[int, int], value: float | tuple[int, ...], border: float | tuple[int, ...] | None=…, thresh: float=…) -> None
  • changed: function getdraw(im=…, hints=…) → function getdraw(im: Image.Image | None=…, hints: list[str] | None=…) -> tuple[ImageDraw2.Draw | None, ModuleType]
  • changed: method ImageDraw.arc(xy, start, end, fill=…, width=…) → method ImageDraw.arc(xy: Coords, start: float, end: float, fill: _Ink | None=…, width: int=…) -> None
  • changed: method ImageDraw.bitmap(xy, bitmap, fill=…) → method ImageDraw.bitmap(xy: Sequence[int], bitmap: Image.Image, fill: _Ink | None=…) -> None
  • changed: method ImageDraw.chord(xy, start, end, fill=…, outline=…, width=…) → method ImageDraw.chord(xy: Coords, start: float, end: float, fill: _Ink | None=…, outline: _Ink | None=…, width: int=…) -> None
  • changed: method ImageDraw.ellipse(xy, fill=…, outline=…, width=…) → method ImageDraw.ellipse(xy: Coords, fill: _Ink | None=…, outline: _Ink | None=…, width: int=…) -> None
  • changed: method ImageDraw.getfont() → method ImageDraw.getfont() -> ImageFont.ImageFont | ImageFont.FreeTypeFont | ImageFont.TransposedFont
  • changed: method ImageDraw.line(xy, fill=…, width=…, joint=…) → method ImageDraw.line(xy: Coords, fill: _Ink | None=…, width: int=…, joint: str | None=…) -> None
  • changed: method ImageDraw.multiline_text(xy, text, fill=…, font=…, anchor=…, spacing=…, align=…, direction=…, features=…, language=…, stroke_width=…, stroke_fill=…, embedded_color=…) → method ImageDraw.multiline_text(xy: tuple[float, float], text: str, fill=…, font: ImageFont.ImageFont | ImageFont.FreeTypeFont | ImageFont.TransposedFont | None=…, anchor=…, spacing=…, align=…, direction=…, features=…, language=…, stroke_width=…, stroke_fill=…, embedded_color=…, *, font_size=…) -> None
  • changed: method ImageDraw.multiline_textbbox(xy, text, font=…, anchor=…, spacing=…, align=…, direction=…, features=…, language=…, stroke_width=…, embedded_color=…) → method ImageDraw.multiline_textbbox(xy, text, font=…, anchor=…, spacing=…, align=…, direction=…, features=…, language=…, stroke_width=…, embedded_color=…, *, font_size=…) -> tuple[int, int, int, int]
  • changed: method ImageDraw.pieslice(xy, start, end, fill=…, outline=…, width=…) → method ImageDraw.pieslice(xy: Coords, start: float, end: float, fill: _Ink | None=…, outline: _Ink | None=…, width: int=…) -> None
  • changed: method ImageDraw.point(xy, fill=…) → method ImageDraw.point(xy: Coords, fill: _Ink | None=…) -> None
  • changed: method ImageDraw.polygon(xy, fill=…, outline=…, width=…) → method ImageDraw.polygon(xy: Coords, fill: _Ink | None=…, outline: _Ink | None=…, width: int=…) -> None
  • changed: method ImageDraw.rectangle(xy, fill=…, outline=…, width=…) → method ImageDraw.rectangle(xy: Coords, fill: _Ink | None=…, outline: _Ink | None=…, width: int=…) -> None
  • changed: method ImageDraw.regular_polygon(bounding_circle, n_sides, rotation=…, fill=…, outline=…) → method ImageDraw.regular_polygon(bounding_circle: Sequence[Sequence[float] | float], n_sides: int, rotation: float=…, fill: _Ink | None=…, outline: _Ink | None=…, width: int=…) -> None
  • changed: method ImageDraw.rounded_rectangle(xy, radius=…, fill=…, outline=…, width=…, *, corners=…) → method ImageDraw.rounded_rectangle(xy: Coords, radius: float=…, fill: _Ink | None=…, outline: _Ink | None=…, width: int=…, *, corners: tuple[bool, bool, bool, bool] | None=…) -> None
  • changed: method ImageDraw.shape(shape, fill=…, outline=…) → method ImageDraw.shape(shape: Image.core._Outline, fill: _Ink | None=…, outline: _Ink | None=…) -> None
  • changed: method ImageDraw.text(xy, text, fill=…, font=…, anchor=…, spacing=…, align=…, direction=…, features=…, language=…, stroke_width=…, stroke_fill=…, embedded_color=…, *args, **kwargs) → method ImageDraw.text(xy: tuple[float, float], text: str, fill=…, font: ImageFont.ImageFont | ImageFont.FreeTypeFont | ImageFont.TransposedFont | None=…, anchor=…, spacing=…, align=…, direction=…, features=…, language=…, stroke_width=…, stroke_fill=…, embedded_color=…, *args, **kwargs) -> None
  • changed: method ImageDraw.textbbox(xy, text, font=…, anchor=…, spacing=…, align=…, direction=…, features=…, language=…, stroke_width=…, embedded_color=…) → method ImageDraw.textbbox(xy, text, font=…, anchor=…, spacing=…, align=…, direction=…, features=…, language=…, stroke_width=…, embedded_color=…, *, font_size=…) -> tuple[int, int, int, int]
  • changed: method ImageDraw.textlength(text, font=…, direction=…, features=…, language=…, embedded_color=…) → method ImageDraw.textlength(text: str, font: ImageFont.ImageFont | ImageFont.FreeTypeFont | ImageFont.TransposedFont | None=…, direction=…, features=…, language=…, embedded_color=…, *, font_size=…) -> float
  • added: method ImageDraw.circle(xy: Sequence[float], radius: float, fill: _Ink | None=…, outline: _Ink | None=…, width: int=…) -> None
  • added: variable Outline: Callable[[], Image.core._Outline] | None
  • removed: method Draw.textsize(text, font)
  • changed: constructor Brush(color, opacity=…) → constructor Brush(color: str, opacity: int=…) -> None
  • changed: constructor Draw(image, size=…, color=…) → constructor Draw(image: Image.Image | str, size: tuple[int, int] | list[int] | None=…, color: float | tuple[float, ...] | str | None=…) -> None
  • changed: constructor Font(color, file, size=…) → constructor Font(color: str, file: StrOrBytesPath | BinaryIO, size: float=…) -> None
  • changed: constructor Pen(color, width=…, opacity=…) → constructor Pen(color: str, width: int=…, opacity: int=…) -> None
  • changed: method Draw.flush() → method Draw.flush() -> Image.Image
  • changed: constructor Brightness(image) → constructor Brightness(image: Image.Image) -> None
  • changed: constructor Color(image) → constructor Color(image: Image.Image) -> None
  • changed: constructor Contrast(image) → constructor Contrast(image: Image.Image) -> None
  • changed: constructor Sharpness(image) → constructor Sharpness(image: Image.Image) -> None
  • removed: property PyDecoder.pulls_fd
  • removed: property PyEncoder.pushes_fd
  • changed: constructor PyCodecState() → constructor PyCodecState() -> None
  • changed: field Parser.image → field Parser.image: Image.Image | None
  • changed: function raise_oserror(error) → function raise_oserror(error: int) -> OSError
  • changed: method ImageFile.get_format_mimetype() → method ImageFile.get_format_mimetype() -> str | None
  • changed: method ImageFile.load_end() → method ImageFile.load_end() -> None
  • changed: method ImageFile.load_prepare() → method ImageFile.load_prepare() -> None
  • changed: method ImageFile.verify() → method ImageFile.verify() -> None
  • changed: method Parser.reset() → method Parser.reset() -> None
  • changed: method PyCodec.cleanup() → method PyCodec.cleanup() -> None
  • changed: method PyCodec.setimage(im, extents=…) → method PyCodec.setimage(im, extents: tuple[int, int, int, int] | None=…) -> None
  • changed: method PyCodecState.extents() → method PyCodecState.extents() -> tuple[int, int, int, int]
  • changed: method PyDecoder.decode(buffer) → method PyDecoder.decode(buffer: bytes) -> tuple[int, int]
  • changed: method PyDecoder.set_as_raw(data, rawmode=…) → method PyDecoder.set_as_raw(data: bytes, rawmode=…) -> None
  • changed: method PyEncoder.encode(bufsize) → method PyEncoder.encode(bufsize: int) -> tuple[int, int, bytes]
  • changed: method PyEncoder.encode_to_pyfd() → method PyEncoder.encode_to_pyfd() -> tuple[int, int]
  • added: class StubHandler
  • added: field PyCodec.fd: IO[bytes] | None
  • added: method StubHandler.load(im: StubImageFile) -> Image.Image
  • added: method StubHandler.open(im: StubImageFile) -> None
  • added: property PyDecoder.pulls_fd -> bool
  • added: property PyEncoder.pushes_fd -> bool
  • changed: constructor BoxBlur(radius) → constructor BoxBlur(radius: float | Sequence[float]) -> None
  • changed: constructor Color3DLUT(size, table, channels=…, target_mode=…, **kwargs) → constructor Color3DLUT(size: int | tuple[int, int, int], table: Sequence[float] | Sequence[Sequence[int]] | NumpyArray, channels: int=…, target_mode: str | None=…, **kwargs: bool) -> None
  • changed: constructor GaussianBlur(radius=…) → constructor GaussianBlur(radius: float | Sequence[float]=…) -> None
  • changed: constructor Kernel(size, kernel, scale=…, offset=…) → constructor Kernel(size: tuple[int, int], kernel: Sequence[float], scale: float | None=…, offset: float=…) -> None
  • changed: constructor MaxFilter(size=…) → constructor MaxFilter(size: int=…) -> None
  • changed: constructor MedianFilter(size=…) → constructor MedianFilter(size: int=…) -> None
  • changed: constructor MinFilter(size=…) → constructor MinFilter(size: int=…) -> None
  • changed: constructor ModeFilter(size=…) → constructor ModeFilter(size: int=…) -> None
  • changed: constructor RankFilter(size, rank) → constructor RankFilter(size: int, rank: int) -> None
  • changed: constructor UnsharpMask(radius=…, percent=…, threshold=…) → constructor UnsharpMask(radius: float=…, percent: int=…, threshold: int=…) -> None
  • changed: method BoxBlur.filter(image) → method BoxBlur.filter(image: _imaging.ImagingCore) -> _imaging.ImagingCore
  • changed: method BuiltinFilter.filter(image) → method BuiltinFilter.filter(image: _imaging.ImagingCore) -> _imaging.ImagingCore
  • changed: method Color3DLUT.filter(image) → method Color3DLUT.filter(image: _imaging.ImagingCore) -> _imaging.ImagingCore
  • changed: method Color3DLUT.transform(callback, with_normals=…, channels=…, target_mode=…) → method Color3DLUT.transform(callback: Callable[..., tuple[float, ...]], with_normals: bool=…, channels: int | None=…, target_mode: str | None=…) -> Color3DLUT
  • changed: method GaussianBlur.filter(image) → method GaussianBlur.filter(image: _imaging.ImagingCore) -> _imaging.ImagingCore
  • changed: method ModeFilter.filter(image) → method ModeFilter.filter(image: _imaging.ImagingCore) -> _imaging.ImagingCore
  • changed: method RankFilter.filter(image) → method RankFilter.filter(image: _imaging.ImagingCore) -> _imaging.ImagingCore
  • changed: method UnsharpMask.filter(image) → method UnsharpMask.filter(image: _imaging.ImagingCore) -> _imaging.ImagingCore
  • changed: static method Color3DLUT.generate(size, callback, channels=…, target_mode=…) → static method Color3DLUT.generate(size: int | tuple[int, int, int], callback: Callable[[float, float, float], tuple[float, ...]], channels: int=…, target_mode: str | None=…) -> Color3DLUT
  • added: field BuiltinFilter.filterargs: tuple[Any, ...]
  • added: method Filter.filter(image: _imaging.ImagingCore) -> _imaging.ImagingCore
  • removed: method FreeTypeFont.getoffset(text)
  • removed: method FreeTypeFont.getsize(text, direction=…, features=…, language=…, stroke_width=…)
  • removed: method FreeTypeFont.getsize_multiline(text, direction=…, spacing=…, features=…, language=…, stroke_width=…)
  • removed: method ImageFont.getsize(text, *args, **kwargs)
  • removed: method TransposedFont.getsize(text, *args, **kwargs)
  • changed: constructor FreeTypeFont(font=…, size=…, index=…, encoding=…, layout_engine=…) → constructor FreeTypeFont(font: StrOrBytesPath | BinaryIO | None=…, size: float=…, index: int=…, encoding: str=…, layout_engine: Layout | None=…) -> None
  • changed: function load(filename) → function load(filename: str) -> ImageFont
  • changed: function load_default() → function load_default(size: float | None=…) -> FreeTypeFont | ImageFont
  • changed: function load_path(filename) → function load_path(filename: str | bytes) -> ImageFont
  • changed: function truetype(font=…, size=…, index=…, encoding=…, layout_engine=…) → function truetype(font: StrOrBytesPath | BinaryIO | None=…, size: float=…, index: int=…, encoding: str=…, layout_engine: Layout | None=…) -> FreeTypeFont
  • changed: method FreeTypeFont.get_variation_names() → method FreeTypeFont.get_variation_names() -> list[bytes]
  • changed: method FreeTypeFont.getbbox(text, mode=…, direction=…, features=…, language=…, stroke_width=…, anchor=…) → method FreeTypeFont.getbbox(text: str | bytes, mode: str=…, direction: str | None=…, features: list[str] | None=…, language: str | None=…, stroke_width: float=…, anchor: str | None=…) -> tuple[float, float, float, float]
  • changed: method FreeTypeFont.getlength(text, mode=…, direction=…, features=…, language=…) → method FreeTypeFont.getlength(text: str | bytes, mode=…, direction=…, features=…, language=…) -> float
  • changed: method FreeTypeFont.getmask2(text, mode=…, fill=…, direction=…, features=…, language=…, stroke_width=…, anchor=…, ink=…, start=…, *args, **kwargs) → method FreeTypeFont.getmask2(text: str | bytes, mode=…, direction=…, features=…, language=…, stroke_width=…, anchor=…, ink=…, start=…, *args, **kwargs)
  • changed: method FreeTypeFont.getmetrics() → method FreeTypeFont.getmetrics() -> tuple[int, int]
  • changed: method FreeTypeFont.getname() → method FreeTypeFont.getname() -> tuple[str | None, str | None]
  • changed: method FreeTypeFont.set_variation_by_axes(axes) → method FreeTypeFont.set_variation_by_axes(axes: list[float]) -> None
  • changed: method ImageFont.getbbox(text, *args, **kwargs) → method ImageFont.getbbox(text: str | bytes | bytearray, *args: Any, **kwargs: Any) -> tuple[int, int, int, int]
  • changed: method ImageFont.getlength(text, *args, **kwargs) → method ImageFont.getlength(text: str | bytes | bytearray, *args: Any, **kwargs: Any) -> int
  • changed: method TransposedFont.getlength(text, *args, **kwargs) → method TransposedFont.getlength(text: str | bytes, *args, **kwargs) -> float
  • added: field FreeTypeFont.font: Font
  • added: field FreeTypeFont.font_bytes: bytes
  • added: field ImageFont.font: ImagingFont
  • added: function load_default_imagefont() -> ImageFont
  • added: variable MAX_STRING_LENGTH
  • added: variable core: ModuleType | DeferredError
  • changed: function grab(bbox=…, include_layered_windows=…, all_screens=…, xdisplay=…) → function grab(bbox: tuple[int, int, int, int] | None=…, include_layered_windows: bool=…, all_screens: bool=…, xdisplay: str | None=…) -> Image.Image
  • changed: function grabclipboard() → function grabclipboard() -> Image.Image | list[str] | None
  • changed: function eval(expression, _dict=…, **kw) → function eval(expression: str, _dict: dict[str, Any]=…, **kw: Any) -> Any
  • changed: function imagemath_convert(self, mode) → function imagemath_convert(self: _Operand, mode: str) -> _Operand
  • changed: function imagemath_equal(self, other) → function imagemath_equal(self: _Operand, other: _Operand | float | None) -> _Operand
  • changed: function imagemath_float(self) → function imagemath_float(self: _Operand) -> _Operand
  • changed: function imagemath_int(self) → function imagemath_int(self: _Operand) -> _Operand
  • changed: function imagemath_max(self, other) → function imagemath_max(self: _Operand, other: _Operand | float | None) -> _Operand
  • changed: function imagemath_min(self, other) → function imagemath_min(self: _Operand, other: _Operand | float | None) -> _Operand
  • changed: function imagemath_notequal(self, other) → function imagemath_notequal(self: _Operand, other: _Operand | float | None) -> _Operand
  • added: function lambda_eval(expression: Callable[[dict[str, Any]], Any], options: dict[str, Any]=…, **kw: Any) -> Any
  • added: function unsafe_eval(expression: str, options: dict[str, Any]=…, **kw: Any) -> Any
  • removed: constructor ModeDescriptor(mode, bands, basemode, basetype, typestr)
  • changed: class ModeDescriptor → class ModeDescriptor(NamedTuple)
  • changed: function getmode(mode) → function getmode(mode: str) -> ModeDescriptor
  • added: field ModeDescriptor.bands: tuple[str, ...]
  • added: field ModeDescriptor.basemode: str
  • added: field ModeDescriptor.basetype: str
  • added: field ModeDescriptor.mode: str
  • added: field ModeDescriptor.typestr: str
  • changed: constructor LutBuilder(patterns=…, op_name=…) → constructor LutBuilder(patterns: list[str] | None=…, op_name: str | None=…) -> None
  • changed: constructor MorphOp(lut=…, op_name=…, patterns=…) → constructor MorphOp(lut: bytearray | None=…, op_name: str | None=…, patterns: list[str] | None=…) -> None
  • changed: method LutBuilder.add_patterns(patterns) → method LutBuilder.add_patterns(patterns: list[str]) -> None
  • changed: method LutBuilder.build_default_lut() → method LutBuilder.build_default_lut() -> None
  • changed: method LutBuilder.build_lut() → method LutBuilder.build_lut() -> bytearray
  • changed: method LutBuilder.get_lut() → method LutBuilder.get_lut() -> bytearray | None
  • changed: method MorphOp.apply(image) → method MorphOp.apply(image: Image.Image) -> tuple[int, Image.Image]
  • changed: method MorphOp.get_on_pixels(image) → method MorphOp.get_on_pixels(image: Image.Image) -> list[tuple[int, int]]
  • changed: method MorphOp.load_lut(filename) → method MorphOp.load_lut(filename: str) -> None
  • changed: method MorphOp.match(image) → method MorphOp.match(image: Image.Image) -> list[tuple[int, int]]
  • changed: method MorphOp.save_lut(filename) → method MorphOp.save_lut(filename: str) -> None
  • changed: method MorphOp.set_lut(lut) → method MorphOp.set_lut(lut: bytearray | None) -> None
  • changed: function autocontrast(image, cutoff=…, ignore=…, mask=…, preserve_tone=…) → function autocontrast(image: Image.Image, cutoff: float | tuple[float, float]=…, ignore: int | Sequence[int] | None=…, mask: Image.Image | None=…, preserve_tone: bool=…) -> Image.Image
  • changed: function colorize(image, black, white, mid=…, blackpoint=…, whitepoint=…, midpoint=…) → function colorize(image: Image.Image, black: str | tuple[int, ...], white: str | tuple[int, ...], mid: str | int | tuple[int, ...] | None=…, blackpoint: int=…, whitepoint: int=…, midpoint: int=…) -> Image.Image
  • changed: function contain(image, size, method=…) → function contain(image: Image.Image, size: tuple[int, int], method: int=…) -> Image.Image
  • changed: function crop(image, border=…) → function crop(image: Image.Image, border: int=…) -> Image.Image
  • changed: function deform(image, deformer, resample=…) → function deform(image: Image.Image, deformer: SupportsGetMesh, resample: int=…) -> Image.Image
  • changed: function equalize(image, mask=…) → function equalize(image: Image.Image, mask: Image.Image | None=…) -> Image.Image
  • changed: function exif_transpose(image) → function exif_transpose(image: Image.Image, *, in_place: bool=…) -> Image.Image | None
  • changed: function expand(image, border=…, fill=…) → function expand(image: Image.Image, border: int | tuple[int, ...]=…, fill: str | int | tuple[int, ...]=…) -> Image.Image
  • changed: function fit(image, size, method=…, bleed=…, centering=…) → function fit(image: Image.Image, size: tuple[int, int], method: int=…, bleed: float=…, centering: tuple[float, float]=…) -> Image.Image
  • changed: function flip(image) → function flip(image: Image.Image) -> Image.Image
  • changed: function grayscale(image) → function grayscale(image: Image.Image) -> Image.Image
  • changed: function invert(image) → function invert(image: Image.Image) -> Image.Image
  • changed: function mirror(image) → function mirror(image: Image.Image) -> Image.Image
  • changed: function pad(image, size, method=…, color=…, centering=…) → function pad(image: Image.Image, size: tuple[int, int], method: int=…, color: str | int | tuple[int, ...] | None=…, centering: tuple[float, float]=…) -> Image.Image
  • changed: function posterize(image, bits) → function posterize(image: Image.Image, bits: int) -> Image.Image
  • changed: function scale(image, factor, resample=…) → function scale(image: Image.Image, factor: float, resample: int=…) -> Image.Image
  • changed: function solarize(image, threshold=…) → function solarize(image: Image.Image, threshold: int=…) -> Image.Image
  • added: class SupportsGetMesh(Protocol)
  • added: function cover(image: Image.Image, size: tuple[int, int], method: int=…) -> Image.Image
  • added: method SupportsGetMesh.getmesh(image: Image.Image) -> list[tuple[tuple[int, int, int, int], tuple[int, int, int, int, int, int, int, int]]]
  • removed: property ImagePalette.colors
  • removed: property ImagePalette.palette
  • changed: constructor ImagePalette(mode=…, palette=…, size=…) → constructor ImagePalette(mode: str=…, palette: Sequence[int] | bytes | bytearray | None=…) -> None
  • changed: function load(filename) → function load(filename: str) -> tuple[bytes, str]
  • changed: function make_gamma_lut(exp) → function make_gamma_lut(exp: float) -> list[int]
  • changed: function make_linear_lut(black, white) → function make_linear_lut(black: int, white: float) -> list[int]
  • changed: function negative(mode=…) → function negative(mode: str=…) -> ImagePalette
  • changed: function random(mode=…) → function random(mode: str=…) -> ImagePalette
  • changed: function raw(rawmode, data) → function raw(rawmode, data: Sequence[int] | bytes | bytearray) -> ImagePalette
  • changed: function sepia(white=…) → function sepia(white: str=…) -> ImagePalette
  • changed: function wedge(mode=…) → function wedge(mode: str=…) -> ImagePalette
  • changed: method ImagePalette.copy() → method ImagePalette.copy() -> ImagePalette
  • changed: method ImagePalette.getcolor(color, image=…) → method ImagePalette.getcolor(color: tuple[int, ...], image: Image.Image | None=…) -> int
  • changed: method ImagePalette.getdata() → method ImagePalette.getdata() -> tuple[str, Sequence[int] | bytes | bytearray]
  • changed: method ImagePalette.save(fp) → method ImagePalette.save(fp: str | IO[str]) -> None
  • changed: method ImagePalette.tobytes() → method ImagePalette.tobytes() -> bytes
  • added: property ImagePalette.colors -> dict[tuple[int, ...], int]
  • added: property ImagePalette.palette -> Sequence[int] | bytes | bytearray
  • changed: function toqimage(im) → function toqimage(im) -> ImageQt
  • added: variable qt_version: str | None
  • changed: constructor Iterator(im) → constructor Iterator(im: Image.Image)
  • changed: function all_frames(im, func=…) → function all_frames(im: Image.Image | list[Image.Image], func: Callable[[Image.Image], Image.Image] | None=…) -> list[Image.Image]
  • changed: field Viewer.format → field Viewer.format: str | None
  • changed: field Viewer.options → field Viewer.options: dict[str, Any]
  • changed: function register(viewer, order=…) → function register(viewer, order: int=…) -> None
  • changed: function show(image, title=…, **options) → function show(image: Image.Image, title: str | None=…, **options: Any) -> bool
  • changed: method DisplayViewer.get_command_ex(file, title=…, **options) → method DisplayViewer.get_command_ex(file: str, title: str | None=…, **options: Any) -> tuple[str, str]
  • changed: method DisplayViewer.show_file(path=…, **options) → method DisplayViewer.show_file(path: str, **options: Any) -> int
  • changed: method EogViewer.get_command_ex(file, **options) → method EogViewer.get_command_ex(file: str, **options: Any) -> tuple[str, str]
  • changed: method EogViewer.show_file(path=…, **options) → method EogViewer.show_file(path: str, **options: Any) -> int
  • changed: method GmDisplayViewer.get_command_ex(file, **options) → method GmDisplayViewer.get_command_ex(file: str, **options: Any) -> tuple[str, str]
  • changed: method GmDisplayViewer.show_file(path=…, **options) → method GmDisplayViewer.show_file(path: str, **options: Any) -> int
  • changed: method IPythonViewer.show_image(image, **options) → method IPythonViewer.show_image(image: Image.Image, **options: Any) -> int
  • changed: method MacViewer.get_command(file, **options) → method MacViewer.get_command(file: str, **options: Any) -> str
  • changed: method MacViewer.show_file(path=…, **options) → method MacViewer.show_file(path: str, **options: Any) -> int
  • changed: method UnixViewer.get_command(file, **options) → method UnixViewer.get_command(file: str, **options: Any) -> str
  • changed: method Viewer.get_command(file, **options) → method Viewer.get_command(file: str, **options: Any) -> str
  • changed: method Viewer.get_format(image) → method Viewer.get_format(image: Image.Image) -> str | None
  • changed: method Viewer.save_image(image) → method Viewer.save_image(image: Image.Image) -> str
  • changed: method Viewer.show(image, **options) → method Viewer.show(image: Image.Image, **options: Any) -> int
  • changed: method Viewer.show_file(path=…, **options) → method Viewer.show_file(path: str, **options: Any) -> int
  • changed: method Viewer.show_image(image, **options) → method Viewer.show_image(image: Image.Image, **options: Any) -> int
  • changed: method WindowsViewer.get_command(file, **options) → method WindowsViewer.get_command(file: str, **options: Any) -> str
  • changed: method XDGViewer.get_command_ex(file, **options) → method XDGViewer.get_command_ex(file: str, **options: Any) -> tuple[str, str]
  • changed: method XDGViewer.show_file(path=…, **options) → method XDGViewer.show_file(path: str, **options: Any) -> int
  • changed: method XVViewer.get_command_ex(file, title=…, **options) → method XVViewer.get_command_ex(file: str, title: str | None=…, **options: Any) -> tuple[str, str]
  • changed: method XVViewer.show_file(path=…, **options) → method XVViewer.show_file(path: str, **options: Any) -> int
  • added: method UnixViewer.get_command_ex(file: str, **options: Any) -> tuple[str, str]
  • added: method WindowsViewer.show_file(path: str, **options: Any) -> int
  • changed: constructor Stat(image_or_list, mask=…) → constructor Stat(image_or_list: Image.Image | list[int], mask: Image.Image | None=…) -> None
  • added: property Stat.count -> list[int]
  • added: property Stat.extrema -> list[tuple[int, int]]
  • added: property Stat.mean -> list[float]
  • added: property Stat.median -> list[int]
  • added: property Stat.rms -> list[float]
  • added: property Stat.stddev -> list[float]
  • added: property Stat.sum -> list[float]
  • added: property Stat.sum2 -> list[float]
  • added: property Stat.var -> list[float]
  • changed: function getimage(photo) → function getimage(photo: PhotoImage) -> Image.Image
  • changed: method BitmapImage.height() → method BitmapImage.height() -> int
  • changed: method BitmapImage.width() → method BitmapImage.width() -> int
  • changed: method PhotoImage.height() → method PhotoImage.height() -> int
  • changed: method PhotoImage.paste(im, box=…) → method PhotoImage.paste(im: Image.Image) -> None
  • changed: method PhotoImage.width() → method PhotoImage.width() -> int
  • changed: constructor Transform(data) → constructor Transform(data: Sequence[Any]) -> None
  • changed: method Transform.getdata() → method Transform.getdata() -> tuple[Image.Transform, Sequence[int]]
  • changed: method Transform.transform(size, image, **options) → method Transform.transform(size: tuple[int, int], image: Image.Image, **options: Any) -> Image.Image
  • added: class PerspectiveTransform(Transform)
  • added: field PerspectiveTransform.method
  • added: field Transform.method: Image.Transform
  • changed: constructor Dib(image, size=…) → constructor Dib(image: Image.Image | str, size: tuple[int, int] | list[int] | None=…) -> None
  • changed: constructor HDC(dc) → constructor HDC(dc: int) -> None
  • changed: constructor HWND(wnd) → constructor HWND(wnd: int) -> None
  • changed: constructor Window(title=…, width=…, height=…) → constructor Window(title: str=…, width: int | None=…, height: int | None=…) -> None
  • changed: method Dib.frombytes(buffer) → method Dib.frombytes(buffer: bytes) -> None
  • changed: method Dib.paste(im, box=…) → method Dib.paste(im: Image.Image, box: tuple[int, int, int, int] | None=…) -> None
  • changed: method Dib.tobytes() → method Dib.tobytes() -> bytes
  • changed: method Window.mainloop() → method Window.mainloop() -> None
  • changed: method Window.ui_handle_destroy() → method Window.ui_handle_destroy() -> None
  • removed: variable PAD
  • changed: function dump(c) → function dump(c: Sequence[int | bytes]) -> None
  • changed: function i(c) → function i(c: bytes) -> int
  • changed: method IptcImageFile.field() → method IptcImageFile.field() -> tuple[tuple[int, int] | None, int]
  • changed: method IptcImageFile.getint(key) → method IptcImageFile.getint(key: tuple[int, int]) -> int
  • changed: method BoxReader.has_next_box() → method BoxReader.has_next_box() -> bool
  • changed: method BoxReader.next_box_type() → method BoxReader.next_box_type() -> bytes
  • changed: method BoxReader.read_boxes() → method BoxReader.read_boxes() -> BoxReader
  • changed: method BoxReader.read_fields(field_format) → method BoxReader.read_fields(field_format: str) -> tuple[int | bytes, ...]
  • removed: function convert_dict_qtables(qtables)
  • removed: method JpegImageFile.getxmp()
  • changed: function COM(self, marker) → function COM(self: JpegImageFile, marker: int) -> None
  • changed: function DQT(self, marker) → function DQT(self: JpegImageFile, marker: int) -> None
  • changed: function SOF(self, marker) → function SOF(self: JpegImageFile, marker: int) -> None
  • changed: function Skip(self, marker) → function Skip(self: JpegImageFile, marker: int) -> None
  • changed: method JpegImageFile.draft(mode, size) → method JpegImageFile.draft(mode: str | None, size: tuple[int, int] | None) -> tuple[str, tuple[int, int, float, float]] | None
  • changed: method JpegImageFile.load_djpeg() → method JpegImageFile.load_djpeg() -> None
  • changed: method JpegImageFile.load_read(read_bytes) → method JpegImageFile.load_read(read_bytes: int) -> bytes
  • changed: method MicImageFile.close() → method MicImageFile.close() -> None
  • changed: method MicImageFile.tell() → method MicImageFile.tell() -> int
  • changed: constructor BitStream(fp) → constructor BitStream(fp: SupportsRead[bytes]) -> None
  • changed: method BitStream.next() → method BitStream.next() -> int
  • changed: method BitStream.peek(bits) → method BitStream.peek(bits: int) -> int
  • changed: method BitStream.read(bits) → method BitStream.read(bits: int) -> int
  • changed: method BitStream.skip(bits) → method BitStream.skip(bits: int) -> None
  • changed: method MpoImageFile.load_seek(pos) → method MpoImageFile.load_seek(pos: int) -> None
  • changed: method MpoImageFile.seek(frame) → method MpoImageFile.seek(frame: int) -> None
  • changed: method MpoImageFile.tell() → method MpoImageFile.tell() -> int
  • changed: method MspDecoder.decode(buffer) → method MspDecoder.decode(buffer: bytes) -> tuple[int, int]
  • changed: method PSDraw.begin_document(id=…) → method PSDraw.begin_document(id: str | None=…) -> None
  • changed: method PSDraw.end_document() → method PSDraw.end_document() -> None
  • changed: method PSDraw.image(box, im, dpi=…) → method PSDraw.image(box: tuple[int, int, int, int], im: Image.Image, dpi: int | None=…) -> None
  • changed: method PSDraw.line(xy0, xy1) → method PSDraw.line(xy0: tuple[int, int], xy1: tuple[int, int]) -> None
  • changed: method PSDraw.rectangle(box) → method PSDraw.rectangle(box: tuple[int, int, int, int]) -> None
  • changed: method PSDraw.setfont(font, size) → method PSDraw.setfont(font: str, size: int) -> None
  • changed: method PSDraw.text(xy, text) → method PSDraw.text(xy: tuple[int, int], text: str) -> None
  • changed: constructor PaletteFile(fp) → constructor PaletteFile(fp: IO[bytes]) -> None
  • changed: method PaletteFile.getpalette() → method PaletteFile.getpalette() -> tuple[bytes, str]
  • changed: function build_prototype_image() → function build_prototype_image() -> Image.Image
  • changed: method PcdImageFile.load_end() → method PcdImageFile.load_end() -> None
  • changed: constructor PcfFontFile(fp, charset_encoding=…) → constructor PcfFontFile(fp: BinaryIO, charset_encoding: str=…)
  • changed: function sz(s, o) → function sz(s: bytes, o: int) -> bytes
  • changed: variable BYTES_PER_ROW → variable BYTES_PER_ROW: list[Callable[[int], int]]
  • changed: class IndirectReference(collections.namedtuple('IndirectReferenceTuple', ['object_id', 'generation'])) → class IndirectReference(IndirectReferenceTuple)
  • changed: class PdfArray(list) → class PdfArray(List[Any])
  • changed: class PdfDict(collections.UserDict) → class PdfDict(_DictBase)
  • changed: function check_format_condition(condition, error_message) → function check_format_condition(condition: bool, error_message: str) -> None
  • changed: function encode_text(s) → function encode_text(s: str) -> bytes
  • changed: method PdfName.name_as_str() → method PdfName.name_as_str() -> str
  • changed: method PdfParser.close() → method PdfParser.close() -> None
  • changed: method PdfParser.close_buf() → method PdfParser.close_buf() -> None
  • changed: method PdfParser.del_root() → method PdfParser.del_root() -> None
  • changed: method PdfParser.read_pdf_info() → method PdfParser.read_pdf_info() -> None
  • changed: method PdfParser.rewrite_pages() → method PdfParser.rewrite_pages() -> None
  • changed: method PdfParser.seek_end() → method PdfParser.seek_end() -> None
  • changed: method PdfParser.start_writing() → method PdfParser.start_writing() -> None
  • changed: method PdfParser.write_catalog() → method PdfParser.write_catalog() -> IndirectReference
  • changed: method PdfParser.write_header() → method PdfParser.write_header() -> None
  • added: class IndirectReferenceTuple(NamedTuple)
  • added: field IndirectReferenceTuple.generation: int
  • added: field IndirectReferenceTuple.object_id: int
  • removed: method PngImageFile.getxmp()
  • changed: constructor ChunkStream(fp) → constructor ChunkStream(fp: IO[bytes]) -> None
  • changed: constructor PngInfo() → constructor PngInfo() -> None
  • changed: method ChunkStream.close() → method ChunkStream.close() -> None
  • changed: method ChunkStream.crc(cid, data) → method ChunkStream.crc(cid: bytes, data: bytes) -> None
  • changed: method ChunkStream.crc_skip(cid, data) → method ChunkStream.crc_skip(cid: bytes, data: bytes) -> None
  • changed: method ChunkStream.push(cid, pos, length) → method ChunkStream.push(cid: bytes, pos: int, length: int) -> None
  • changed: method ChunkStream.read() → method ChunkStream.read() -> tuple[bytes, int, int]
  • changed: method ChunkStream.verify(endchunk=…) → method ChunkStream.verify(endchunk: bytes=…) -> list[bytes]
  • changed: method PngImageFile.getexif() → method PngImageFile.getexif() -> Image.Exif
  • changed: method PngImageFile.load_end() → method PngImageFile.load_end() -> None
  • changed: method PngImageFile.load_prepare() → method PngImageFile.load_prepare() -> None
  • changed: method PngImageFile.load_read(read_bytes) → method PngImageFile.load_read(read_bytes: int) -> bytes
  • changed: method PngImageFile.seek(frame) → method PngImageFile.seek(frame: int) -> None
  • changed: method PngImageFile.tell() → method PngImageFile.tell() -> int
  • changed: method PngImageFile.verify() → method PngImageFile.verify() -> None
  • changed: method PngInfo.add(cid, data, after_idat=…) → method PngInfo.add(cid: bytes, data: bytes, after_idat: bool=…) -> None
  • changed: method PngInfo.add_itxt(key, value, lang=…, tkey=…, zip=…) → method PngInfo.add_itxt(key: str | bytes, value: str | bytes, lang: str | bytes=…, tkey: str | bytes=…, zip: bool=…) -> None
  • changed: method PngInfo.add_text(key, value, zip=…) → method PngInfo.add_text(key: str | bytes, value: str | bytes | iTXt, zip: bool=…) -> None
  • changed: method PngStream.check_text_memory(chunklen) → method PngStream.check_text_memory(chunklen: int) -> None
  • changed: method PngStream.chunk_IDAT(pos, length) → method PngStream.chunk_IDAT(pos: int, length: int) -> NoReturn
  • changed: method PngStream.chunk_IEND(pos, length) → method PngStream.chunk_IEND(pos: int, length: int) -> NoReturn
  • changed: method PngStream.chunk_IHDR(pos, length) → method PngStream.chunk_IHDR(pos: int, length: int) -> bytes
  • changed: method PngStream.chunk_PLTE(pos, length) → method PngStream.chunk_PLTE(pos: int, length: int) -> bytes
  • changed: method PngStream.chunk_acTL(pos, length) → method PngStream.chunk_acTL(pos: int, length: int) -> bytes
  • changed: method PngStream.chunk_cHRM(pos, length) → method PngStream.chunk_cHRM(pos: int, length: int) -> bytes
  • changed: method PngStream.chunk_eXIf(pos, length) → method PngStream.chunk_eXIf(pos: int, length: int) -> bytes
  • changed: method PngStream.chunk_fcTL(pos, length) → method PngStream.chunk_fcTL(pos: int, length: int) -> bytes
  • changed: method PngStream.chunk_fdAT(pos, length) → method PngStream.chunk_fdAT(pos: int, length: int) -> bytes
  • changed: method PngStream.chunk_gAMA(pos, length) → method PngStream.chunk_gAMA(pos: int, length: int) -> bytes
  • changed: method PngStream.chunk_iCCP(pos, length) → method PngStream.chunk_iCCP(pos: int, length: int) -> bytes
  • changed: method PngStream.chunk_iTXt(pos, length) → method PngStream.chunk_iTXt(pos: int, length: int) -> bytes
  • changed: method PngStream.chunk_pHYs(pos, length) → method PngStream.chunk_pHYs(pos: int, length: int) -> bytes
  • changed: method PngStream.chunk_sRGB(pos, length) → method PngStream.chunk_sRGB(pos: int, length: int) -> bytes
  • changed: method PngStream.chunk_tEXt(pos, length) → method PngStream.chunk_tEXt(pos: int, length: int) -> bytes
  • changed: method PngStream.chunk_tRNS(pos, length) → method PngStream.chunk_tRNS(pos: int, length: int) -> bytes
  • changed: method PngStream.chunk_zTXt(pos, length) → method PngStream.chunk_zTXt(pos: int, length: int) -> bytes
  • changed: method PngStream.rewind() → method PngStream.rewind() -> None
  • changed: method PngStream.save_rewind() → method PngStream.save_rewind() -> None
  • added: field iTXt.lang: str | bytes | None
  • added: field iTXt.tkey: str | bytes | None
  • changed: method PpmDecoder.decode(buffer) → method PpmDecoder.decode(buffer: bytes) -> tuple[int, int]
  • changed: method PpmPlainDecoder.decode(buffer) → method PpmPlainDecoder.decode(buffer: bytes) -> tuple[int, int]
  • changed: method PsdImageFile.seek(layer) → method PsdImageFile.seek(layer: int) -> None
  • changed: method PsdImageFile.tell() → method PsdImageFile.tell() -> int
  • added: property PsdImageFile.is_animated -> bool
  • added: property PsdImageFile.layers
  • added: property PsdImageFile.n_frames -> int
  • changed: constructor PyAccess(img, readonly=…) → constructor PyAccess(img: Image.Image, readonly: bool=…) -> None
  • changed: function new(img, readonly=…) → function new(img: Image.Image, readonly: bool=…) -> PyAccess | None
  • changed: method PyAccess.check_xy(xy) → method PyAccess.check_xy(xy: tuple[int, int]) -> tuple[int, int]
  • added: method PyAccess.get_pixel(x: int, y: int) -> float | tuple[int, ...]
  • added: method PyAccess.set_pixel(x: int, y: int, color: float | tuple[int, ...] | list[int]) -> None
  • added: variable FFI: type
  • changed: method QoiDecoder.decode(buffer) → method QoiDecoder.decode(buffer: bytes) -> tuple[int, int]
  • changed: method SGI16Decoder.decode(buffer) → method SGI16Decoder.decode(buffer: bytes) -> tuple[int, int]
  • removed: property SpiderImageFile.is_animated
  • removed: property SpiderImageFile.n_frames
  • changed: function isInt(f) → function isInt(f: Any) -> int
  • changed: function isSpiderHeader(t) → function isSpiderHeader(t: tuple[float, ...]) -> int
  • changed: function isSpiderImage(filename) → function isSpiderImage(filename: str) -> int
  • changed: function loadImageSeries(filelist=…) → function loadImageSeries(filelist: list[str] | None=…) -> list[SpiderImageFile] | None
  • changed: function makeSpiderHeader(im) → function makeSpiderHeader(im: Image.Image) -> list[bytes]
  • changed: method SpiderImageFile.convert2byte(depth=…) → method SpiderImageFile.convert2byte(depth: int=…) -> Image.Image
  • changed: method SpiderImageFile.seek(frame) → method SpiderImageFile.seek(frame: int) -> None
  • changed: method SpiderImageFile.tell() → method SpiderImageFile.tell() -> int
  • changed: method SpiderImageFile.tkPhotoImage() → method SpiderImageFile.tkPhotoImage() -> ImageTk.PhotoImage
  • added: property SpiderImageFile.is_animated -> bool
  • added: property SpiderImageFile.n_frames -> int
  • changed: class TarIO(ContainerIO.ContainerIO) → class TarIO(ContainerIO.ContainerIO[bytes])
  • changed: constructor TarIO(tarfile, file) → constructor TarIO(tarfile: str, file: str) -> None
  • changed: method TarIO.close() → method TarIO.close() -> None
  • changed: method TgaImageFile.load_end() → method TgaImageFile.load_end() -> None
  • removed: field ImageFileDirectory_v2.legacy_api
  • removed: method ImageFileDirectory_v2.legacy_api(value)
  • removed: method TiffImageFile.getxmp()
  • changed: class ImageFileDirectory_v2(MutableMapping) → class ImageFileDirectory_v2(_IFDv2Base)
  • changed: constructor ImageFileDirectory_v2(ifh=…, prefix=…, group=…) → constructor ImageFileDirectory_v2(ifh: bytes=…, prefix: bytes | None=…, group: int | None=…) -> None
  • changed: field ImageFileDirectory_v1.tagtype: dict → field ImageFileDirectory_v1.tagtype: dict[int, int]
  • changed: method AppendingTiffWriter.close() → method AppendingTiffWriter.close() -> None
  • changed: method AppendingTiffWriter.finalize() → method AppendingTiffWriter.finalize() -> None
  • changed: method AppendingTiffWriter.fixIFD() → method AppendingTiffWriter.fixIFD() -> None
  • changed: method AppendingTiffWriter.fixOffsets(count, isShort=…, isLong=…) → method AppendingTiffWriter.fixOffsets(count: int, isShort: bool=…, isLong: bool=…) -> None
  • changed: method AppendingTiffWriter.goToEnd() → method AppendingTiffWriter.goToEnd() -> None
  • changed: method AppendingTiffWriter.newFrame() → method AppendingTiffWriter.newFrame() -> None
  • changed: method AppendingTiffWriter.readLong() → method AppendingTiffWriter.readLong() -> int
  • changed: method AppendingTiffWriter.readShort() → method AppendingTiffWriter.readShort() -> int
  • changed: method AppendingTiffWriter.rewriteLastLong(value) → method AppendingTiffWriter.rewriteLastLong(value: int) -> None
  • changed: method AppendingTiffWriter.rewriteLastShort(value) → method AppendingTiffWriter.rewriteLastShort(value: int) -> None
  • changed: method AppendingTiffWriter.rewriteLastShortToLong(value) → method AppendingTiffWriter.rewriteLastShortToLong(value: int) -> None
  • changed: method AppendingTiffWriter.setEndian(endian) → method AppendingTiffWriter.setEndian(endian: str) -> None
  • changed: method AppendingTiffWriter.setup() → method AppendingTiffWriter.setup() -> None
  • changed: method AppendingTiffWriter.skipIFDs() → method AppendingTiffWriter.skipIFDs() -> None
  • changed: method AppendingTiffWriter.tell() → method AppendingTiffWriter.tell() -> int
  • changed: method AppendingTiffWriter.write(data) → method AppendingTiffWriter.write(data: bytes) -> int | None
  • changed: method AppendingTiffWriter.writeLong(value) → method AppendingTiffWriter.writeLong(value: int) -> None
  • changed: method AppendingTiffWriter.writeShort(value) → method AppendingTiffWriter.writeShort(value: int) -> None
  • changed: method ImageFileDirectory_v1.to_v2() → method ImageFileDirectory_v1.to_v2() -> ImageFileDirectory_v2
  • changed: method ImageFileDirectory_v2.reset() → method ImageFileDirectory_v2.reset() -> None
  • changed: method TiffImageFile.load_end() → method TiffImageFile.load_end() -> None
  • changed: method TiffImageFile.seek(frame) → method TiffImageFile.seek(frame: int) -> None
  • changed: method TiffImageFile.tell() → method TiffImageFile.tell() -> int
  • added: property ImageFileDirectory_v2.legacy_api -> bool
  • added: variable OSUBFILETYPE
  • changed: class TagInfo(namedtuple('_TagInfo', 'value name type length enum')) → class TagInfo(_TagInfo)
  • changed: variable TAGS_V2 → variable TAGS_V2: dict[int, TagInfo]
  • changed: variable TYPES → variable TYPES: dict[int, str]
  • removed: method WebPImageFile.getxmp()
  • changed: method WebPImageFile.seek(frame) → method WebPImageFile.seek(frame: int) -> None
  • changed: method WebPImageFile.tell() → method WebPImageFile.tell() -> int
  • added: method WebPImageFile.load_seek(pos: int) -> None
  • changed: class WmfHandler → class WmfHandler(ImageFile.StubHandler)
  • changed: function register_handler(handler) → function register_handler(handler: ImageFile.StubHandler | None) -> None
  • changed: method WmfHandler.load(im) → method WmfHandler.load(im: ImageFile.StubImageFile) -> Image.Image
  • changed: method WmfHandler.open(im) → method WmfHandler.open(im: ImageFile.StubImageFile) -> None
  • changed: method XpmImageFile.load_read(bytes) → method XpmImageFile.load_read(read_bytes: int) -> bytes
  • changed: function check(feature) → function check(feature: str) -> bool | None
  • changed: function check_codec(feature) → function check_codec(feature: str) -> bool
  • changed: function check_feature(feature) → function check_feature(feature: str) -> bool | None
  • changed: function check_module(feature) → function check_module(feature: str) -> bool
  • changed: function get_supported() → function get_supported() -> list[str]
  • changed: function get_supported_codecs() → function get_supported_codecs() -> list[str]
  • changed: function get_supported_features() → function get_supported_features() -> list[str]
  • changed: function get_supported_modules() → function get_supported_modules() -> list[str]
  • changed: function pilinfo(out=…, supported_formats=…) → function pilinfo(out: IO[str] | None=…, supported_formats: bool=…) -> None
  • changed: function version(feature) → function version(feature: str) -> str | None
  • changed: function version_codec(feature) → function version_codec(feature: str) -> str | None
  • changed: function version_feature(feature) → function version_feature(feature: str) -> str | None
  • changed: function version_module(feature) → function version_module(feature: str) -> str | None