Skip to content

Commit 5ad98e7

Browse files
committed
Moved get_child_images()
1 parent 3111e37 commit 5ad98e7

File tree

2 files changed

+47
-47
lines changed

2 files changed

+47
-47
lines changed

src/PIL/Image.py

Lines changed: 0 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1553,52 +1553,6 @@ def _reload_exif(self) -> None:
15531553
self._exif._loaded = False
15541554
self.getexif()
15551555

1556-
def get_child_images(self) -> list[ImageFile.ImageFile]:
1557-
child_images = []
1558-
exif = self.getexif()
1559-
ifds = []
1560-
if ExifTags.Base.SubIFDs in exif:
1561-
subifd_offsets = exif[ExifTags.Base.SubIFDs]
1562-
if subifd_offsets:
1563-
if not isinstance(subifd_offsets, tuple):
1564-
subifd_offsets = (subifd_offsets,)
1565-
for subifd_offset in subifd_offsets:
1566-
ifds.append((exif._get_ifd_dict(subifd_offset), subifd_offset))
1567-
ifd1 = exif.get_ifd(ExifTags.IFD.IFD1)
1568-
if ifd1 and ifd1.get(ExifTags.Base.JpegIFOffset):
1569-
assert exif._info is not None
1570-
ifds.append((ifd1, exif._info.next))
1571-
1572-
offset = None
1573-
for ifd, ifd_offset in ifds:
1574-
current_offset = self.fp.tell()
1575-
if offset is None:
1576-
offset = current_offset
1577-
1578-
fp = self.fp
1579-
if ifd is not None:
1580-
thumbnail_offset = ifd.get(ExifTags.Base.JpegIFOffset)
1581-
if thumbnail_offset is not None:
1582-
thumbnail_offset += getattr(self, "_exif_offset", 0)
1583-
self.fp.seek(thumbnail_offset)
1584-
data = self.fp.read(ifd.get(ExifTags.Base.JpegIFByteCount))
1585-
fp = io.BytesIO(data)
1586-
1587-
with open(fp) as im:
1588-
from . import TiffImagePlugin
1589-
1590-
if thumbnail_offset is None and isinstance(
1591-
im, TiffImagePlugin.TiffImageFile
1592-
):
1593-
im._frame_pos = [ifd_offset]
1594-
im._seek(0)
1595-
im.load()
1596-
child_images.append(im)
1597-
1598-
if offset is not None:
1599-
self.fp.seek(offset)
1600-
return child_images
1601-
16021556
def getim(self) -> CapsuleType:
16031557
"""
16041558
Returns a capsule that points to the internal image memory.

src/PIL/ImageFile.py

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636
import sys
3737
from typing import IO, TYPE_CHECKING, Any, NamedTuple, cast
3838

39-
from . import Image
39+
from . import ExifTags, Image
4040
from ._deprecate import deprecate
4141
from ._util import is_path
4242

@@ -163,6 +163,52 @@ def __init__(
163163
def _open(self) -> None:
164164
pass
165165

166+
def get_child_images(self) -> list[ImageFile]:
167+
child_images = []
168+
exif = self.getexif()
169+
ifds = []
170+
if ExifTags.Base.SubIFDs in exif:
171+
subifd_offsets = exif[ExifTags.Base.SubIFDs]
172+
if subifd_offsets:
173+
if not isinstance(subifd_offsets, tuple):
174+
subifd_offsets = (subifd_offsets,)
175+
for subifd_offset in subifd_offsets:
176+
ifds.append((exif._get_ifd_dict(subifd_offset), subifd_offset))
177+
ifd1 = exif.get_ifd(ExifTags.IFD.IFD1)
178+
if ifd1 and ifd1.get(ExifTags.Base.JpegIFOffset):
179+
assert exif._info is not None
180+
ifds.append((ifd1, exif._info.next))
181+
182+
offset = None
183+
for ifd, ifd_offset in ifds:
184+
current_offset = self.fp.tell()
185+
if offset is None:
186+
offset = current_offset
187+
188+
fp = self.fp
189+
if ifd is not None:
190+
thumbnail_offset = ifd.get(ExifTags.Base.JpegIFOffset)
191+
if thumbnail_offset is not None:
192+
thumbnail_offset += getattr(self, "_exif_offset", 0)
193+
self.fp.seek(thumbnail_offset)
194+
data = self.fp.read(ifd.get(ExifTags.Base.JpegIFByteCount))
195+
fp = io.BytesIO(data)
196+
197+
with Image.open(fp) as im:
198+
from . import TiffImagePlugin
199+
200+
if thumbnail_offset is None and isinstance(
201+
im, TiffImagePlugin.TiffImageFile
202+
):
203+
im._frame_pos = [ifd_offset]
204+
im._seek(0)
205+
im.load()
206+
child_images.append(im)
207+
208+
if offset is not None:
209+
self.fp.seek(offset)
210+
return child_images
211+
166212
def get_format_mimetype(self) -> str | None:
167213
if self.custom_mimetype:
168214
return self.custom_mimetype

0 commit comments

Comments
 (0)