Skip to content

Commit

Permalink
Use transposed size after opening for TIFF images
Browse files Browse the repository at this point in the history
  • Loading branch information
radarhere committed Sep 18, 2024
1 parent 08d9c89 commit f1e8696
Show file tree
Hide file tree
Showing 7 changed files with 30 additions and 26 deletions.
2 changes: 2 additions & 0 deletions Tests/test_image_copy.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,5 +49,7 @@ def test_copy_zero() -> None:
@skip_unless_feature("libtiff")
def test_deepcopy() -> None:
with Image.open("Tests/images/g4_orientation_5.tif") as im:
assert im.size == (590, 88)

out = copy.deepcopy(im)
assert out.size == (590, 88)
4 changes: 1 addition & 3 deletions Tests/test_image_resize.py
Original file line number Diff line number Diff line change
Expand Up @@ -300,9 +300,7 @@ def resize(mode: str, size: tuple[int, int] | list[int]) -> None:
im.resize((10, 10), "unknown")

@skip_unless_feature("libtiff")
def test_load_first(self) -> None:
# load() may change the size of the image
# Test that resize() is calling it before getting the size
def test_transposed(self) -> None:
with Image.open("Tests/images/g4_orientation_5.tif") as im:
im = im.resize((64, 64))
assert im.size == (64, 64)
Expand Down
8 changes: 3 additions & 5 deletions Tests/test_image_thumbnail.py
Original file line number Diff line number Diff line change
Expand Up @@ -92,15 +92,13 @@ def test_no_resize() -> None:


@skip_unless_feature("libtiff")
def test_load_first() -> None:
# load() may change the size of the image
# Test that thumbnail() is calling it before performing size calculations
def test_transposed() -> None:
with Image.open("Tests/images/g4_orientation_5.tif") as im:
assert im.size == (590, 88)

im.thumbnail((64, 64))
assert im.size == (64, 10)

# Test thumbnail(), without draft(),
# on an image that is large enough once load() has changed the size
with Image.open("Tests/images/g4_orientation_5.tif") as im:
im.thumbnail((590, 88), reducing_gap=None)
assert im.size == (590, 88)
Expand Down
4 changes: 3 additions & 1 deletion Tests/test_numpy.py
Original file line number Diff line number Diff line change
Expand Up @@ -238,8 +238,10 @@ def test_zero_size() -> None:


@skip_unless_feature("libtiff")
def test_load_first() -> None:
def test_transposed() -> None:
with Image.open("Tests/images/g4_orientation_5.tif") as im:
assert im.size == (590, 88)

a = numpy.array(im)
assert a.shape == (88, 590)

Expand Down
20 changes: 5 additions & 15 deletions src/PIL/Image.py
Original file line number Diff line number Diff line change
Expand Up @@ -2332,7 +2332,6 @@ def resize(
msg = "reducing_gap must be 1.0 or greater"
raise ValueError(msg)

self.load()
if box is None:
box = (0, 0) + self.size

Expand Down Expand Up @@ -2781,27 +2780,18 @@ def round_aspect(number: float, key: Callable[[int], float]) -> int:
)
return x, y

preserved_size = preserve_aspect_ratio()
if preserved_size is None:
return
final_size = preserved_size

box = None
final_size: tuple[int, int]
if reducing_gap is not None:
preserved_size = preserve_aspect_ratio()
if preserved_size is None:
return
final_size = preserved_size

res = self.draft(
None, (int(size[0] * reducing_gap), int(size[1] * reducing_gap))
)
if res is not None:
box = res[1]
if box is None:
self.load()

# load() may have changed the size of the image
preserved_size = preserve_aspect_ratio()
if preserved_size is None:
return
final_size = preserved_size

if self.size != final_size:
im = self.resize(final_size, resample, box=box, reducing_gap=reducing_gap)
Expand Down
2 changes: 1 addition & 1 deletion src/PIL/ImageFile.py
Original file line number Diff line number Diff line change
Expand Up @@ -322,7 +322,7 @@ def load(self) -> Image.core.PixelAccess | None:

def load_prepare(self) -> None:
# create image memory if necessary
if self._im is None or self.im.mode != self.mode or self.im.size != self.size:
if self._im is None or self.im.mode != self.mode:
self.im = Image.core.new(self.mode, self.size)
# create palette (optional)
if self.mode == "P":
Expand Down
16 changes: 15 additions & 1 deletion src/PIL/TiffImagePlugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -1275,6 +1275,11 @@ def load(self) -> Image.core.PixelAccess | None:
return self._load_libtiff()
return super().load()

def load_prepare(self) -> None:
if self._im is None and self._will_be_transposed:
self.im = Image.core.new(self.mode, self.size[::-1])
ImageFile.ImageFile.load_prepare(self)

def load_end(self) -> None:
# allow closing if we're on the first frame, there's no next
# This is the ImageFile.load path only, libtiff specific below.
Expand Down Expand Up @@ -1416,7 +1421,16 @@ def _setup(self) -> None:
if not isinstance(xsize, int) or not isinstance(ysize, int):
msg = "Invalid dimensions"
raise ValueError(msg)
self._size = xsize, ysize
self._will_be_transposed = self.tag_v2.get(ExifTags.Base.Orientation) in (
5,
6,
7,
8,
)
if self._will_be_transposed:
self._size = ysize, xsize
else:
self._size = xsize, ysize

logger.debug("- size: %s", self.size)

Expand Down

0 comments on commit f1e8696

Please sign in to comment.