|
25 | 25 | from typing import IO |
26 | 26 |
|
27 | 27 | from . import Image, ImageFile, PngImagePlugin, features |
| 28 | +from ._deprecate import deprecate |
28 | 29 |
|
29 | 30 | enable_jpeg2k = features.check_codec("jpg_2000") |
30 | 31 | if enable_jpeg2k: |
@@ -275,37 +276,37 @@ def _open(self) -> None: |
275 | 276 | self.best_size[1] * self.best_size[2], |
276 | 277 | ) |
277 | 278 |
|
278 | | - @property |
279 | | - def size(self): |
| 279 | + @property # type: ignore[override] |
| 280 | + def size(self) -> tuple[int, int] | tuple[int, int, int]: |
280 | 281 | return self._size |
281 | 282 |
|
282 | 283 | @size.setter |
283 | | - def size(self, value) -> None: |
284 | | - info_size = value |
285 | | - if info_size not in self.info["sizes"] and len(info_size) == 2: |
286 | | - info_size = (info_size[0], info_size[1], 1) |
287 | | - if ( |
288 | | - info_size not in self.info["sizes"] |
289 | | - and len(info_size) == 3 |
290 | | - and info_size[2] == 1 |
291 | | - ): |
292 | | - simple_sizes = [ |
293 | | - (size[0] * size[2], size[1] * size[2]) for size in self.info["sizes"] |
294 | | - ] |
295 | | - if value in simple_sizes: |
296 | | - info_size = self.info["sizes"][simple_sizes.index(value)] |
297 | | - if info_size not in self.info["sizes"]: |
298 | | - msg = "This is not one of the allowed sizes of this image" |
299 | | - raise ValueError(msg) |
300 | | - self._size = value |
301 | | - |
302 | | - def load(self) -> Image.core.PixelAccess | None: |
303 | | - if len(self.size) == 3: |
304 | | - self.best_size = self.size |
305 | | - self.size = ( |
306 | | - self.best_size[0] * self.best_size[2], |
307 | | - self.best_size[1] * self.best_size[2], |
308 | | - ) |
| 284 | + def size(self, value: tuple[int, int] | tuple[int, int, int]) -> None: |
| 285 | + if len(value) == 3: |
| 286 | + deprecate("Setting size to (width, height, scale)", 12, "load(scale)") |
| 287 | + if value in self.info["sizes"]: |
| 288 | + self._size = value # type: ignore[assignment] |
| 289 | + return |
| 290 | + else: |
| 291 | + # Check that a matching size exists, |
| 292 | + # or that there is a scale that would create a size that matches |
| 293 | + for size in self.info["sizes"]: |
| 294 | + simple_size = size[0] * size[2], size[1] * size[2] |
| 295 | + scale = simple_size[0] // value[0] |
| 296 | + if simple_size[1] / value[1] == scale: |
| 297 | + self._size = value |
| 298 | + return |
| 299 | + msg = "This is not one of the allowed sizes of this image" |
| 300 | + raise ValueError(msg) |
| 301 | + |
| 302 | + def load(self, scale: int | None = None) -> Image.core.PixelAccess | None: |
| 303 | + if scale is not None or len(self.size) == 3: |
| 304 | + if scale is None and len(self.size) == 3: |
| 305 | + scale = self.size[2] |
| 306 | + assert scale is not None |
| 307 | + width, height = self.size[:2] |
| 308 | + self.size = width * scale, height * scale |
| 309 | + self.best_size = width, height, scale |
309 | 310 |
|
310 | 311 | px = Image.Image.load(self) |
311 | 312 | if self._im is not None and self.im.size == self.size: |
|
0 commit comments