Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 6 additions & 3 deletions src/PIL/BmpImagePlugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
from __future__ import annotations

import os
from typing import IO

from . import Image, ImageFile, ImagePalette
from ._binary import i16le as i16
Expand Down Expand Up @@ -52,7 +53,7 @@ def _accept(prefix: bytes) -> bool:
return prefix[:2] == b"BM"


def _dib_accept(prefix):
def _dib_accept(prefix: bytes) -> bool:
return i32(prefix) in [12, 40, 52, 56, 64, 108, 124]


Expand Down Expand Up @@ -394,11 +395,13 @@ def _open(self) -> None:
}


def _dib_save(im, fp, filename):
def _dib_save(im: Image.Image, fp: IO[bytes], filename: str) -> None:
_save(im, fp, filename, False)


def _save(im, fp, filename, bitmap_header=True):
def _save(
im: Image.Image, fp: IO[bytes], filename: str, bitmap_header: bool = True
) -> None:
try:
rawmode, bits, colors = SAVE[im.mode]
except KeyError as e:
Expand Down
4 changes: 3 additions & 1 deletion src/PIL/BufrStubImagePlugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
#
from __future__ import annotations

from typing import IO

from . import Image, ImageFile

_handler = None
Expand Down Expand Up @@ -58,7 +60,7 @@ def _load(self) -> ImageFile.StubHandler | None:
return _handler


def _save(im, fp, filename):
def _save(im: Image.Image, fp: IO[bytes], filename: str) -> None:
if _handler is None or not hasattr(_handler, "save"):
msg = "BUFR save handler not installed"
raise OSError(msg)
Expand Down
3 changes: 2 additions & 1 deletion src/PIL/DdsImagePlugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import struct
import sys
from enum import IntEnum, IntFlag
from typing import IO

from . import Image, ImageFile, ImagePalette
from ._binary import i32le as i32
Expand Down Expand Up @@ -510,7 +511,7 @@ def decode(self, buffer):
return -1, 0


def _save(im, fp, filename):
def _save(im: Image.Image, fp: IO[bytes], filename: str) -> None:
if im.mode not in ("RGB", "RGBA", "L", "LA"):
msg = f"cannot write mode {im.mode} as DDS"
raise OSError(msg)
Expand Down
16 changes: 9 additions & 7 deletions src/PIL/GifImagePlugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
import subprocess
from enum import IntEnum
from functools import cached_property
from typing import IO

from . import (
Image,
Expand Down Expand Up @@ -336,14 +337,13 @@ def _seek(self, frame, update_image=True):
self._mode = "RGB"
self.im = self.im.convert("RGB", Image.Dither.FLOYDSTEINBERG)

def _rgb(color):
def _rgb(color: int) -> tuple[int, int, int]:
if self._frame_palette:
if color * 3 + 3 > len(self._frame_palette.palette):
color = 0
color = tuple(self._frame_palette.palette[color * 3 : color * 3 + 3])
return tuple(self._frame_palette.palette[color * 3 : color * 3 + 3])
else:
color = (color, color, color)
return color
return (color, color, color)

self.dispose_extent = frame_dispose_extent
try:
Expand Down Expand Up @@ -709,11 +709,13 @@ def _write_multiple_frames(im, fp, palette):
return True


def _save_all(im, fp, filename):
def _save_all(im: Image.Image, fp: IO[bytes], filename: str) -> None:
_save(im, fp, filename, save_all=True)


def _save(im, fp, filename, save_all=False):
def _save(
im: Image.Image, fp: IO[bytes], filename: str, save_all: bool = False
) -> None:
# header
if "palette" in im.encoderinfo or "palette" in im.info:
palette = im.encoderinfo.get("palette", im.info.get("palette"))
Expand All @@ -730,7 +732,7 @@ def _save(im, fp, filename, save_all=False):
fp.flush()


def get_interlace(im):
def get_interlace(im: Image.Image) -> int:
interlace = im.encoderinfo.get("interlace", 1)

# workaround for @PIL153
Expand Down
4 changes: 3 additions & 1 deletion src/PIL/GribStubImagePlugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
#
from __future__ import annotations

from typing import IO

from . import Image, ImageFile

_handler = None
Expand Down Expand Up @@ -58,7 +60,7 @@ def _load(self) -> ImageFile.StubHandler | None:
return _handler


def _save(im, fp, filename):
def _save(im: Image.Image, fp: IO[bytes], filename: str) -> None:
if _handler is None or not hasattr(_handler, "save"):
msg = "GRIB save handler not installed"
raise OSError(msg)
Expand Down
6 changes: 4 additions & 2 deletions src/PIL/IcoImagePlugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
import warnings
from io import BytesIO
from math import ceil, log
from typing import IO

from . import BmpImagePlugin, Image, ImageFile, PngImagePlugin
from ._binary import i16le as i16
Expand All @@ -39,7 +40,7 @@
_MAGIC = b"\0\0\1\0"


def _save(im, fp, filename):
def _save(im: Image.Image, fp: IO[bytes], filename: str) -> None:
fp.write(_MAGIC) # (2+2)
bmp = im.encoderinfo.get("bitmap_format") == "bmp"
sizes = im.encoderinfo.get(
Expand Down Expand Up @@ -194,7 +195,7 @@ def getimage(self, size, bpp=False):
"""
return self.frame(self.getentryindex(size, bpp))

def frame(self, idx):
def frame(self, idx: int) -> Image.Image:
"""
Get an image from frame idx
"""
Expand All @@ -205,6 +206,7 @@ def frame(self, idx):
data = self.buf.read(8)
self.buf.seek(header["offset"])

im: Image.Image
if data[:8] == PngImagePlugin._MAGIC:
# png frame
im = PngImagePlugin.PngImageFile(self.buf)
Expand Down
5 changes: 3 additions & 2 deletions src/PIL/ImImagePlugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@

import os
import re
from typing import IO, Any

from . import Image, ImageFile, ImagePalette

Expand Down Expand Up @@ -103,7 +104,7 @@
split = re.compile(rb"^([A-Za-z][^:]*):[ \t]*(.*)[ \t]*$")


def number(s):
def number(s: Any) -> float:
try:
return int(s)
except ValueError:
Expand Down Expand Up @@ -325,7 +326,7 @@ def tell(self) -> int:
}


def _save(im, fp, filename):
def _save(im: Image.Image, fp: IO[bytes], filename: str) -> None:
try:
image_type, rawmode = SAVE[im.mode]
except KeyError as e:
Expand Down
20 changes: 10 additions & 10 deletions src/PIL/Image.py
Original file line number Diff line number Diff line change
Expand Up @@ -2875,7 +2875,7 @@ def transpose(self, method: Transpose) -> Image:
self.load()
return self._new(self.im.transpose(method))

def effect_spread(self, distance):
def effect_spread(self, distance: int) -> Image:
"""
Randomly spread pixels in an image.

Expand Down Expand Up @@ -3012,7 +3012,7 @@ def new(
return im._new(core.fill(mode, size, color))


def frombytes(mode, size, data, decoder_name="raw", *args) -> Image:
def frombytes(mode, size, data, decoder_name: str = "raw", *args) -> Image:
"""
Creates a copy of an image memory from pixel data in a buffer.

Expand Down Expand Up @@ -3051,7 +3051,7 @@ def frombytes(mode, size, data, decoder_name="raw", *args) -> Image:
return im


def frombuffer(mode, size, data, decoder_name="raw", *args) -> Image:
def frombuffer(mode: str, size, data, decoder_name: str = "raw", *args) -> Image:
"""
Creates an image memory referencing pixel data in a byte buffer.

Expand Down Expand Up @@ -3553,7 +3553,7 @@ def register_save(id: str, driver) -> None:
SAVE[id.upper()] = driver


def register_save_all(id, driver) -> None:
def register_save_all(id: str, driver) -> None:
"""
Registers an image function to save all the frames
of a multiframe format. This function should not be
Expand All @@ -3565,7 +3565,7 @@ def register_save_all(id, driver) -> None:
SAVE_ALL[id.upper()] = driver


def register_extension(id, extension) -> None:
def register_extension(id: str, extension: str) -> None:
"""
Registers an image extension. This function should not be
used in application code.
Expand All @@ -3576,7 +3576,7 @@ def register_extension(id, extension) -> None:
EXTENSION[extension.lower()] = id.upper()


def register_extensions(id, extensions) -> None:
def register_extensions(id: str, extensions: list[str]) -> None:
"""
Registers image extensions. This function should not be
used in application code.
Expand All @@ -3588,7 +3588,7 @@ def register_extensions(id, extensions) -> None:
register_extension(id, extension)


def registered_extensions():
def registered_extensions() -> dict[str, str]:
"""
Returns a dictionary containing all file extensions belonging
to registered plugins
Expand Down Expand Up @@ -3650,7 +3650,7 @@ def effect_mandelbrot(size, extent, quality):
return Image()._new(core.effect_mandelbrot(size, extent, quality))


def effect_noise(size, sigma):
def effect_noise(size: tuple[int, int], sigma: float) -> Image:
"""
Generate Gaussian noise centered around 128.

Expand All @@ -3661,7 +3661,7 @@ def effect_noise(size, sigma):
return Image()._new(core.effect_noise(size, sigma))


def linear_gradient(mode):
def linear_gradient(mode: str) -> Image:
"""
Generate 256x256 linear gradient from black to white, top to bottom.

Expand All @@ -3670,7 +3670,7 @@ def linear_gradient(mode):
return Image()._new(core.linear_gradient(mode))


def radial_gradient(mode):
def radial_gradient(mode: str) -> Image:
"""
Generate 256x256 radial gradient from black to white, centre to edge.

Expand Down
3 changes: 2 additions & 1 deletion src/PIL/MpoImagePlugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import itertools
import os
import struct
from typing import IO

from . import (
Image,
Expand All @@ -32,7 +33,7 @@
from ._binary import o32le


def _save(im, fp, filename):
def _save(im: Image.Image, fp: IO[bytes], filename: str) -> None:
JpegImagePlugin._save(im, fp, filename)


Expand Down
3 changes: 2 additions & 1 deletion src/PIL/PdfImagePlugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
import math
import os
import time
from typing import IO

from . import Image, ImageFile, ImageSequence, PdfParser, __version__, features

Expand All @@ -39,7 +40,7 @@
# 5. page contents


def _save_all(im, fp, filename):
def _save_all(im: Image.Image, fp: IO[bytes], filename: str) -> None:
_save(im, fp, filename, save_all=True)


Expand Down
6 changes: 3 additions & 3 deletions src/PIL/SpiderImagePlugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@
import os
import struct
import sys
from typing import TYPE_CHECKING
from typing import IO, TYPE_CHECKING

from . import Image, ImageFile

Expand Down Expand Up @@ -263,7 +263,7 @@ def makeSpiderHeader(im: Image.Image) -> list[bytes]:
return [struct.pack("f", v) for v in hdr]


def _save(im, fp, filename):
def _save(im: Image.Image, fp: IO[bytes], filename: str) -> None:
if im.mode[0] != "F":
im = im.convert("F")

Expand All @@ -279,7 +279,7 @@ def _save(im, fp, filename):
ImageFile._save(im, fp, [("raw", (0, 0) + im.size, 0, (rawmode, 0, 1))])


def _save_spider(im, fp, filename):
def _save_spider(im: Image.Image, fp: IO[bytes], filename: str) -> None:
# get the filename extension and register it with Image
ext = os.path.splitext(filename)[1]
Image.register_extension(SpiderImageFile.format, ext)
Expand Down
4 changes: 2 additions & 2 deletions src/PIL/TiffImagePlugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -1995,7 +1995,7 @@ def newFrame(self) -> None:
self.finalize()
self.setup()

def __enter__(self):
def __enter__(self) -> AppendingTiffWriter:
return self

def __exit__(self, exc_type, exc_value, traceback):
Expand Down Expand Up @@ -2023,7 +2023,7 @@ def goToEnd(self) -> None:
self.f.write(bytes(pad_bytes))
self.offsetOfNewPage = self.f.tell()

def setEndian(self, endian):
def setEndian(self, endian: str) -> None:
self.endian = endian
self.longFmt = f"{self.endian}L"
self.shortFmt = f"{self.endian}H"
Expand Down
4 changes: 3 additions & 1 deletion src/PIL/WmfImagePlugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@
# http://wvware.sourceforge.net/caolan/ora-wmf.html
from __future__ import annotations

from typing import IO

from . import Image, ImageFile
from ._binary import i16le as word
from ._binary import si16le as short
Expand Down Expand Up @@ -161,7 +163,7 @@ def load(self, dpi=None):
return super().load()


def _save(im, fp, filename):
def _save(im: Image.Image, fp: IO[bytes], filename: str) -> None:
if _handler is None or not hasattr(_handler, "save"):
msg = "WMF save handler not installed"
raise OSError(msg)
Expand Down