Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit a78ed95

Browse files
committed
Determine size from markers, not EXIF data
1 parent 794a7d6 commit a78ed95

File tree

3 files changed

+10
-21
lines changed

3 files changed

+10
-21
lines changed
0 Bytes
Binary file not shown.

Tests/test_file_mpo.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ def test_exif(test_file: str) -> None:
9393

9494
def test_frame_size() -> None:
9595
# This image has been hexedited to contain a different size
96-
# in the EXIF data of the second frame
96+
# in the SOF marker of the second frame
9797
with Image.open("Tests/images/sugarshack_frame_size.mpo") as im:
9898
assert im.size == (640, 480)
9999

src/PIL/MpoImagePlugin.py

Lines changed: 9 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,11 @@
2424
import struct
2525

2626
from . import (
27-
ExifTags,
2827
Image,
29-
ImageFile,
3028
ImageSequence,
3129
JpegImagePlugin,
3230
TiffImagePlugin,
3331
)
34-
from ._binary import i16be as i16
3532
from ._binary import o32le
3633

3734

@@ -109,7 +106,6 @@ def _open(self):
109106
self._after_jpeg_open()
110107

111108
def _after_jpeg_open(self, mpheader=None):
112-
self._initial_size = self.size
113109
self.mpinfo = mpheader if mpheader is not None else self._getmp()
114110
self.n_frames = self.mpinfo[0xB001]
115111
self.__mpoffsets = [
@@ -137,27 +133,20 @@ def seek(self, frame):
137133
self.fp = self._fp
138134
self.offset = self.__mpoffsets[frame]
139135

136+
original_exif = self.info.get("exif")
137+
if "exif" in self.info:
138+
del self.info["exif"]
139+
140140
self.fp.seek(self.offset + 2) # skip SOI marker
141-
segment = self.fp.read(2)
142-
if not segment:
141+
if not self.fp.read(2):
143142
msg = "No data found for frame"
144143
raise ValueError(msg)
145-
self._size = self._initial_size
146-
if i16(segment) == 0xFFE1: # APP1
147-
n = i16(self.fp.read(2)) - 2
148-
self.info["exif"] = ImageFile._safe_read(self.fp, n)
149-
self._reload_exif()
150-
151-
mptype = self.mpinfo[0xB002][frame]["Attribute"]["MPType"]
152-
if mptype.startswith("Large Thumbnail"):
153-
exif = self.getexif().get_ifd(ExifTags.IFD.Exif)
154-
if 40962 in exif and 40963 in exif:
155-
self._size = (exif[40962], exif[40963])
156-
elif "exif" in self.info:
157-
del self.info["exif"]
144+
self.fp.seek(self.offset)
145+
JpegImagePlugin.JpegImageFile._open(self)
146+
if self.info.get("exif") != original_exif:
158147
self._reload_exif()
159148

160-
self.tile = [("jpeg", (0, 0) + self.size, self.offset, (self.mode, ""))]
149+
self.tile = [("jpeg", (0, 0) + self.size, self.offset, self.tile[0][-1])]
161150
self.__frame = frame
162151

163152
def tell(self):

0 commit comments

Comments
 (0)