Skip to content

Commit

Permalink
Merge pull request #7884 from radarhere/mpo
Browse files Browse the repository at this point in the history
  • Loading branch information
hugovk committed Mar 28, 2024
2 parents d734c8b + a78ed95 commit c2904b8
Show file tree
Hide file tree
Showing 3 changed files with 10 additions and 21 deletions.
Binary file modified Tests/images/sugarshack_frame_size.mpo
Binary file not shown.
2 changes: 1 addition & 1 deletion Tests/test_file_mpo.py
Expand Up @@ -93,7 +93,7 @@ def test_exif(test_file: str) -> None:

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

Expand Down
29 changes: 9 additions & 20 deletions src/PIL/MpoImagePlugin.py
Expand Up @@ -24,14 +24,11 @@
import struct

from . import (
ExifTags,
Image,
ImageFile,
ImageSequence,
JpegImagePlugin,
TiffImagePlugin,
)
from ._binary import i16be as i16
from ._binary import o32le


Expand Down Expand Up @@ -109,7 +106,6 @@ def _open(self):
self._after_jpeg_open()

def _after_jpeg_open(self, mpheader=None):
self._initial_size = self.size
self.mpinfo = mpheader if mpheader is not None else self._getmp()
self.n_frames = self.mpinfo[0xB001]
self.__mpoffsets = [
Expand Down Expand Up @@ -137,27 +133,20 @@ def seek(self, frame):
self.fp = self._fp
self.offset = self.__mpoffsets[frame]

original_exif = self.info.get("exif")
if "exif" in self.info:
del self.info["exif"]

self.fp.seek(self.offset + 2) # skip SOI marker
segment = self.fp.read(2)
if not segment:
if not self.fp.read(2):
msg = "No data found for frame"
raise ValueError(msg)
self._size = self._initial_size
if i16(segment) == 0xFFE1: # APP1
n = i16(self.fp.read(2)) - 2
self.info["exif"] = ImageFile._safe_read(self.fp, n)
self._reload_exif()

mptype = self.mpinfo[0xB002][frame]["Attribute"]["MPType"]
if mptype.startswith("Large Thumbnail"):
exif = self.getexif().get_ifd(ExifTags.IFD.Exif)
if 40962 in exif and 40963 in exif:
self._size = (exif[40962], exif[40963])
elif "exif" in self.info:
del self.info["exif"]
self.fp.seek(self.offset)
JpegImagePlugin.JpegImageFile._open(self)
if self.info.get("exif") != original_exif:
self._reload_exif()

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

def tell(self):
Expand Down

0 comments on commit c2904b8

Please sign in to comment.