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
2 changes: 1 addition & 1 deletion Tests/test_file_iptc.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ def test_open() -> None:

f = create_iptc_image()
with Image.open(f) as im:
assert im.tile == [("iptc", (0, 0, 1, 1), 25, ("raw", None))]
assert im.tile == [("iptc", None, 25, ("raw", None))]
assert_image_equal(im, expected)

with Image.open(f) as im:
Expand Down
1 change: 0 additions & 1 deletion Tests/test_file_pcx.py
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,6 @@ def test_pil184() -> None:
test_file = "Tests/images/pil184.pcx"
with Image.open(test_file) as im:
assert im.size == (447, 144)
assert im.tile[0][1] == (0, 0, 447, 144)

# Make sure all pixels are either 0 or 255.
assert im.histogram()[0] + im.histogram()[255] == 447 * 144
Expand Down
2 changes: 1 addition & 1 deletion src/PIL/AvifImagePlugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,7 @@ def seek(self, frame: int) -> None:

# Set tile
self.__frame = frame
self.tile = [ImageFile._Tile("raw", (0, 0, *self.size), 0, self.mode)]
self.tile = [ImageFile._Tile("raw", args=self.mode)]

def load(self) -> Image.core.PixelAccess | None:
if self.tile:
Expand Down
4 changes: 2 additions & 2 deletions src/PIL/BlpImagePlugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -294,7 +294,7 @@ def _open(self) -> None:
decoder = self.magic.decode()

self._mode = "RGBA" if alpha else "RGB"
self.tile = [ImageFile._Tile(decoder, (0, 0, *self.size), offset, args)]
self.tile = [ImageFile._Tile(decoder, None, offset, args)]


class _BLPBaseDecoder(abc.ABC, ImageFile.PyDecoder):
Expand Down Expand Up @@ -491,7 +491,7 @@ def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None:
fp.write(struct.pack("<i", 5))
fp.write(struct.pack("<i", 0))

ImageFile._save(im, fp, [ImageFile._Tile("BLP", (0, 0, *im.size), 0, im.mode)])
ImageFile._save(im, fp, [ImageFile._Tile("BLP", args=im.mode)])


Image.register_open(BlpImageFile.format, BlpImageFile, _accept)
Expand Down
4 changes: 1 addition & 3 deletions src/PIL/BmpImagePlugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -499,9 +499,7 @@ def _save(
if palette:
fp.write(palette)

ImageFile._save(
im, fp, [ImageFile._Tile("raw", (0, 0, *im.size), 0, (rawmode, stride, -1))]
)
ImageFile._save(im, fp, [ImageFile._Tile("raw", args=(rawmode, stride, -1))])


#
Expand Down
2 changes: 1 addition & 1 deletion src/PIL/CurImagePlugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ def _open(self) -> None:
# patch up the bitmap height
self._size = self.width, self.height // 2
if not self._masked:
self.tile = [self.tile[0]._replace(extents=(0, 0, *self.size))]
self.tile = [self.tile[0]._replace(extents=None)]

def load_prepare(self) -> None:
if self._masked:
Expand Down
11 changes: 4 additions & 7 deletions src/PIL/DdsImagePlugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -352,7 +352,6 @@ def _open(self) -> None:

flags, height, width = struct.unpack("<3I", header[:12])
self._size = (width, height)
extents = (0, 0, *self.size)

pitch, depth, mipmaps = struct.unpack("<3I", header[12:24])
struct.unpack("<11I", header[24:68]) # reserved
Expand All @@ -371,7 +370,7 @@ def _open(self) -> None:
mask_count = 3

masks = struct.unpack(f"<{mask_count}I", header[84 : 84 + mask_count * 4])
self.tile = [ImageFile._Tile("dds_rgb", extents, 0, (bitcount, masks))]
self.tile = [ImageFile._Tile("dds_rgb", args=(bitcount, masks))]
return
elif pfflags & DDPF.LUMINANCE:
if bitcount == 8:
Expand Down Expand Up @@ -480,11 +479,9 @@ def _open(self) -> None:
raise NotImplementedError(msg)

if n:
self.tile = [
ImageFile._Tile("bcn", extents, offset, (n, self.pixel_format))
]
self.tile = [ImageFile._Tile("bcn", None, offset, (n, self.pixel_format))]
else:
self.tile = [ImageFile._Tile("raw", extents, 0, rawmode or self.mode)]
self.tile = [ImageFile._Tile("raw", args=rawmode or self.mode)]

def load_seek(self, pos: int) -> None:
pass
Expand Down Expand Up @@ -624,7 +621,7 @@ def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None:
# dxgi_format, 2D resource, misc, array size, straight alpha
struct.pack("<5I", dxgi_format, 3, 0, 0, 1)
)
ImageFile._save(im, fp, [ImageFile._Tile(codec_name, (0, 0, *im.size), 0, args)])
ImageFile._save(im, fp, [ImageFile._Tile(codec_name, args=args)])


def _accept(prefix: bytes) -> bool:
Expand Down
6 changes: 2 additions & 4 deletions src/PIL/EpsImagePlugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -385,9 +385,7 @@ def read_comment(s: str) -> bool:
bounding_box[3] - bounding_box[1],
)

self.tile = [
ImageFile._Tile("eps", (0, 0, *self.size), offset, (length, bounding_box))
]
self.tile = [ImageFile._Tile("eps", None, offset, (length, bounding_box))]

def _find_offset(self, fp: IO[bytes]) -> tuple[int, int]:
s = fp.read(4)
Expand Down Expand Up @@ -474,7 +472,7 @@ def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes, eps: int = 1) -
if hasattr(fp, "flush"):
fp.flush()

ImageFile._save(im, fp, [ImageFile._Tile("eps", (0, 0, *im.size))])
ImageFile._save(im, fp, [ImageFile._Tile("eps")])

fp.write(b"\n%%%%EndBinary\n")
fp.write(b"grestore end\n")
Expand Down
2 changes: 1 addition & 1 deletion src/PIL/FitsImagePlugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ def _open(self) -> None:
raise ValueError(msg)

offset += self.fp.tell() - 80
self.tile = [ImageFile._Tile(decoder_name, (0, 0, *self.size), offset, args)]
self.tile = [ImageFile._Tile(decoder_name, None, offset, args)]

def _get_size(
self, headers: dict[bytes, bytes], prefix: bytes
Expand Down
2 changes: 1 addition & 1 deletion src/PIL/FliImagePlugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,7 @@ def _seek(self, frame: int) -> None:
framesize = i32(s)

self.decodermaxblock = framesize
self.tile = [ImageFile._Tile("fli", (0, 0, *self.size), self.__offset)]
self.tile = [ImageFile._Tile("fli", None, self.__offset)]

self.__offset += framesize

Expand Down
4 changes: 2 additions & 2 deletions src/PIL/FtexImagePlugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -96,10 +96,10 @@ def _open(self) -> None:

if format == Format.DXT1:
self._mode = "RGBA"
self.tile = [ImageFile._Tile("bcn", (0, 0, *self.size), 0, (1,))]
self.tile = [ImageFile._Tile("bcn", args=(1,))]
elif format == Format.UNCOMPRESSED:
self._mode = "RGB"
self.tile = [ImageFile._Tile("raw", (0, 0, *self.size), 0, "RGB")]
self.tile = [ImageFile._Tile("raw", args="RGB")]
else:
msg = f"Invalid texture compression format: {repr(format)}"
raise ValueError(msg)
Expand Down
2 changes: 1 addition & 1 deletion src/PIL/GdImageFile.py
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ def _open(self) -> None:
self.tile = [
ImageFile._Tile(
"raw",
(0, 0, *self.size),
None,
7 + true_color_offset + 6 + 256 * 4,
"L",
)
Expand Down
4 changes: 1 addition & 3 deletions src/PIL/GifImagePlugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -634,9 +634,7 @@ def _write_single_frame(
_write_local_header(fp, im, (0, 0), flags)

im_out.encoderconfig = (8, get_interlace(im))
ImageFile._save(
im_out, fp, [ImageFile._Tile("gif", (0, 0, *im.size), 0, RAWMODE[im_out.mode])]
)
ImageFile._save(im_out, fp, [ImageFile._Tile("gif", args=RAWMODE[im_out.mode])])

fp.write(b"\0") # end of image data

Expand Down
7 changes: 3 additions & 4 deletions src/PIL/IcoImagePlugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -135,7 +135,7 @@ def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None:
ImageFile._save(
and_mask,
image_io,
[ImageFile._Tile("raw", (0, 0, *size), 0, ("1", 0, -1))],
[ImageFile._Tile("raw", args=("1", 0, -1))],
)
else:
frame.save(image_io, "png")
Expand Down Expand Up @@ -263,8 +263,7 @@ def frame(self, idx: int) -> Image.Image:

# change tile dimension to only encompass XOR image
im._size = (im.size[0], int(im.size[1] / 2))
d, e, o, a = im.tile[0]
im.tile[0] = ImageFile._Tile(d, (0, 0, *im.size), o, a)
im.tile = [im.tile[0]._replace(extents=None)]

# figure out where AND mask image starts
if header.bpp == 32:
Expand All @@ -274,7 +273,7 @@ def frame(self, idx: int) -> Image.Image:
# channel.

# Back up to start of bmp data
self.buf.seek(o)
self.buf.seek(im.tile[0].offset)
# extract every 4th byte (eg. 3,7,11,15,...)
alpha_bytes = self.buf.read(im.size[0] * im.size[1] * 4)[3::4]

Expand Down
24 changes: 7 additions & 17 deletions src/PIL/ImImagePlugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -266,9 +266,7 @@ def _open(self) -> None:
bits = int(self.rawmode[2:])
if bits not in [8, 16, 32]:
self.tile = [
ImageFile._Tile(
"bit", (0, 0, *self.size), offs, (bits, 8, 3, 0, -1)
)
ImageFile._Tile("bit", None, offs, (bits, 8, 3, 0, -1))
]
return
except ValueError:
Expand All @@ -279,17 +277,13 @@ def _open(self) -> None:
# ever stumbled upon such a file ;-)
size = self.size[0] * self.size[1]
self.tile = [
ImageFile._Tile("raw", (0, 0, *self.size), offs, ("G", 0, -1)),
ImageFile._Tile("raw", (0, 0, *self.size), offs + size, ("R", 0, -1)),
ImageFile._Tile(
"raw", (0, 0, *self.size), offs + 2 * size, ("B", 0, -1)
),
ImageFile._Tile("raw", None, offs, ("G", 0, -1)),
ImageFile._Tile("raw", None, offs + size, ("R", 0, -1)),
ImageFile._Tile("raw", None, offs + 2 * size, ("B", 0, -1)),
]
else:
# LabEye/IFUNC files
self.tile = [
ImageFile._Tile("raw", (0, 0, *self.size), offs, (self.rawmode, 0, -1))
]
self.tile = [ImageFile._Tile("raw", None, offs, (self.rawmode, 0, -1))]

@property
def n_frames(self) -> int:
Expand Down Expand Up @@ -317,9 +311,7 @@ def seek(self, frame: int) -> None:

self.fp = self._fp

self.tile = [
ImageFile._Tile("raw", (0, 0, *self.size), offs, (self.rawmode, 0, -1))
]
self.tile = [ImageFile._Tile("raw", None, offs, (self.rawmode, 0, -1))]

def tell(self) -> int:
return self.frame
Expand Down Expand Up @@ -385,9 +377,7 @@ def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None:
palette += im_palette[colors * i : colors * (i + 1)]
palette += b"\x00" * (256 - colors)
fp.write(palette) # 768 bytes
ImageFile._save(
im, fp, [ImageFile._Tile("raw", (0, 0, *im.size), 0, (rawmode, 0, -1))]
)
ImageFile._save(im, fp, [ImageFile._Tile("raw", args=(rawmode, 0, -1))])


#
Expand Down
4 changes: 2 additions & 2 deletions src/PIL/Image.py
Original file line number Diff line number Diff line change
Expand Up @@ -884,7 +884,7 @@ def tobytes(self, encoder_name: str = "raw", *args: Any) -> bytes:
# unpack data
e = _getencoder(self.mode, encoder_name, encoder_args)
try:
e.setimage(self.im, (0, 0, *self.size))
e.setimage(self.im)

from . import ImageFile

Expand Down Expand Up @@ -957,7 +957,7 @@ def frombytes(

# unpack data
d = _getdecoder(self.mode, decoder_name, decoder_args)
d.setimage(self.im, (0, 0, *self.size))
d.setimage(self.im)
s = d.decode(data)

if s[0] >= 0:
Expand Down
2 changes: 1 addition & 1 deletion src/PIL/ImageFile.py
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ def _tilesort(t: _Tile) -> int:

class _Tile(NamedTuple):
codec_name: str
extents: tuple[int, int, int, int] | None
extents: tuple[int, int, int, int] | None = None
offset: int = 0
args: tuple[Any, ...] | str | None = None

Expand Down
2 changes: 1 addition & 1 deletion src/PIL/ImtImagePlugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ def _open(self) -> None:
self.tile = [
ImageFile._Tile(
"raw",
(0, 0, *self.size),
None,
self.fp.tell() - len(buffer),
self.mode,
)
Expand Down
4 changes: 1 addition & 3 deletions src/PIL/IptcImagePlugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -125,9 +125,7 @@ def _open(self) -> None:

# tile
if tag == (8, 10):
self.tile = [
ImageFile._Tile("iptc", (0, 0, *self.size), offset, (compression, band))
]
self.tile = [ImageFile._Tile("iptc", None, offset, (compression, band))]

def load(self) -> Image.core.PixelAccess | None:
if self.tile:
Expand Down
12 changes: 5 additions & 7 deletions src/PIL/Jpeg2KImagePlugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -319,9 +319,7 @@ def _open(self) -> None:
self.tile = [
ImageFile._Tile(
"jpeg2k",
(0, 0, *self.size),
0,
(self.codec, self._reduce, self.layers, fd, length),
args=(self.codec, self._reduce, self.layers, fd, length),
)
]

Expand Down Expand Up @@ -374,9 +372,9 @@ def load(self) -> Image.core.PixelAccess | None:

# Update the reduce and layers settings
t = self.tile[0]
assert isinstance(t[3], tuple)
t3 = (t[3][0], self._reduce, self.layers, t[3][3], t[3][4])
self.tile = [ImageFile._Tile(t[0], (0, 0, *self.size), t[2], t3)]
assert isinstance(t.args, tuple)
args = (t.args[0], self._reduce, self.layers, t.args[3], t.args[4])
self.tile = [t._replace(args=args)]

return ImageFile.ImageFile.load(self)

Expand Down Expand Up @@ -455,7 +453,7 @@ def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None:
plt,
)

ImageFile._save(im, fp, [ImageFile._Tile("jpeg2k", (0, 0, *im.size), 0, kind)])
ImageFile._save(im, fp, [ImageFile._Tile("jpeg2k", args=kind)])


# ------------------------------------------------------------
Expand Down
17 changes: 6 additions & 11 deletions src/PIL/JpegImagePlugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -395,9 +395,7 @@ def _open(self) -> None:
rawmode = self.mode
if self.mode == "CMYK":
rawmode = "CMYK;I" # assume adobe conventions
self.tile = [
ImageFile._Tile("jpeg", (0, 0, *self.size), 0, (rawmode, ""))
]
self.tile = [ImageFile._Tile("jpeg", args=(rawmode, ""))]
# self.__offset = self.fp.tell()
break
s = self.fp.read(1)
Expand Down Expand Up @@ -460,12 +458,11 @@ def draft(
for s in [8, 4, 2, 1]:
if scale >= s:
break
assert e is not None
e = (
e[0],
e[1],
(e[2] - e[0] + s - 1) // s + e[0],
(e[3] - e[1] + s - 1) // s + e[1],
0,
0,
(self.size[0] + s - 1) // s,
(self.size[1] + s - 1) // s,
)
self._size = ((self.size[0] + s - 1) // s, (self.size[1] + s - 1) // s)
scale = s
Expand Down Expand Up @@ -868,9 +865,7 @@ def validate_qtables(
# and the comment (COM marker).
bufsize = max(len(exif) + 5, len(extra), len(comment or b"") + 5)

ImageFile._save(
im, fp, [ImageFile._Tile("jpeg", (0, 0, *im.size), 0, rawmode)], bufsize
)
ImageFile._save(im, fp, [ImageFile._Tile("jpeg", args=rawmode)], bufsize)


##
Expand Down
4 changes: 1 addition & 3 deletions src/PIL/McIdasImagePlugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -67,9 +67,7 @@ def _open(self) -> None:
offset = w[34] + w[15]
stride = w[15] + w[10] * w[11] * w[14]

self.tile = [
ImageFile._Tile("raw", (0, 0, *self.size), offset, (rawmode, stride, 1))
]
self.tile = [ImageFile._Tile("raw", None, offset, (rawmode, stride, 1))]


# --------------------------------------------------------------------
Expand Down
4 changes: 1 addition & 3 deletions src/PIL/MpoImagePlugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -166,9 +166,7 @@ def seek(self, frame: int) -> None:
if self.info.get("exif") != original_exif:
self._reload_exif()

self.tile = [
ImageFile._Tile("jpeg", (0, 0, *self.size), self.offset, self.tile[0][-1])
]
self.tile = [ImageFile._Tile("jpeg", None, self.offset, self.tile[0][-1])]
self.__frame = frame
Image.Image.seek(self, frame)

Expand Down
Loading
Loading