mirror of
https://github.com/python-pillow/Pillow.git
synced 2025-01-22 15:24:37 +03:00
Moved get_child_images()
This commit is contained in:
parent
3111e37bf4
commit
5ad98e7abb
|
@ -1553,52 +1553,6 @@ class Image:
|
||||||
self._exif._loaded = False
|
self._exif._loaded = False
|
||||||
self.getexif()
|
self.getexif()
|
||||||
|
|
||||||
def get_child_images(self) -> list[ImageFile.ImageFile]:
|
|
||||||
child_images = []
|
|
||||||
exif = self.getexif()
|
|
||||||
ifds = []
|
|
||||||
if ExifTags.Base.SubIFDs in exif:
|
|
||||||
subifd_offsets = exif[ExifTags.Base.SubIFDs]
|
|
||||||
if subifd_offsets:
|
|
||||||
if not isinstance(subifd_offsets, tuple):
|
|
||||||
subifd_offsets = (subifd_offsets,)
|
|
||||||
for subifd_offset in subifd_offsets:
|
|
||||||
ifds.append((exif._get_ifd_dict(subifd_offset), subifd_offset))
|
|
||||||
ifd1 = exif.get_ifd(ExifTags.IFD.IFD1)
|
|
||||||
if ifd1 and ifd1.get(ExifTags.Base.JpegIFOffset):
|
|
||||||
assert exif._info is not None
|
|
||||||
ifds.append((ifd1, exif._info.next))
|
|
||||||
|
|
||||||
offset = None
|
|
||||||
for ifd, ifd_offset in ifds:
|
|
||||||
current_offset = self.fp.tell()
|
|
||||||
if offset is None:
|
|
||||||
offset = current_offset
|
|
||||||
|
|
||||||
fp = self.fp
|
|
||||||
if ifd is not None:
|
|
||||||
thumbnail_offset = ifd.get(ExifTags.Base.JpegIFOffset)
|
|
||||||
if thumbnail_offset is not None:
|
|
||||||
thumbnail_offset += getattr(self, "_exif_offset", 0)
|
|
||||||
self.fp.seek(thumbnail_offset)
|
|
||||||
data = self.fp.read(ifd.get(ExifTags.Base.JpegIFByteCount))
|
|
||||||
fp = io.BytesIO(data)
|
|
||||||
|
|
||||||
with open(fp) as im:
|
|
||||||
from . import TiffImagePlugin
|
|
||||||
|
|
||||||
if thumbnail_offset is None and isinstance(
|
|
||||||
im, TiffImagePlugin.TiffImageFile
|
|
||||||
):
|
|
||||||
im._frame_pos = [ifd_offset]
|
|
||||||
im._seek(0)
|
|
||||||
im.load()
|
|
||||||
child_images.append(im)
|
|
||||||
|
|
||||||
if offset is not None:
|
|
||||||
self.fp.seek(offset)
|
|
||||||
return child_images
|
|
||||||
|
|
||||||
def getim(self) -> CapsuleType:
|
def getim(self) -> CapsuleType:
|
||||||
"""
|
"""
|
||||||
Returns a capsule that points to the internal image memory.
|
Returns a capsule that points to the internal image memory.
|
||||||
|
|
|
@ -36,7 +36,7 @@ import struct
|
||||||
import sys
|
import sys
|
||||||
from typing import IO, TYPE_CHECKING, Any, NamedTuple, cast
|
from typing import IO, TYPE_CHECKING, Any, NamedTuple, cast
|
||||||
|
|
||||||
from . import Image
|
from . import ExifTags, Image
|
||||||
from ._deprecate import deprecate
|
from ._deprecate import deprecate
|
||||||
from ._util import is_path
|
from ._util import is_path
|
||||||
|
|
||||||
|
@ -163,6 +163,52 @@ class ImageFile(Image.Image):
|
||||||
def _open(self) -> None:
|
def _open(self) -> None:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
def get_child_images(self) -> list[ImageFile]:
|
||||||
|
child_images = []
|
||||||
|
exif = self.getexif()
|
||||||
|
ifds = []
|
||||||
|
if ExifTags.Base.SubIFDs in exif:
|
||||||
|
subifd_offsets = exif[ExifTags.Base.SubIFDs]
|
||||||
|
if subifd_offsets:
|
||||||
|
if not isinstance(subifd_offsets, tuple):
|
||||||
|
subifd_offsets = (subifd_offsets,)
|
||||||
|
for subifd_offset in subifd_offsets:
|
||||||
|
ifds.append((exif._get_ifd_dict(subifd_offset), subifd_offset))
|
||||||
|
ifd1 = exif.get_ifd(ExifTags.IFD.IFD1)
|
||||||
|
if ifd1 and ifd1.get(ExifTags.Base.JpegIFOffset):
|
||||||
|
assert exif._info is not None
|
||||||
|
ifds.append((ifd1, exif._info.next))
|
||||||
|
|
||||||
|
offset = None
|
||||||
|
for ifd, ifd_offset in ifds:
|
||||||
|
current_offset = self.fp.tell()
|
||||||
|
if offset is None:
|
||||||
|
offset = current_offset
|
||||||
|
|
||||||
|
fp = self.fp
|
||||||
|
if ifd is not None:
|
||||||
|
thumbnail_offset = ifd.get(ExifTags.Base.JpegIFOffset)
|
||||||
|
if thumbnail_offset is not None:
|
||||||
|
thumbnail_offset += getattr(self, "_exif_offset", 0)
|
||||||
|
self.fp.seek(thumbnail_offset)
|
||||||
|
data = self.fp.read(ifd.get(ExifTags.Base.JpegIFByteCount))
|
||||||
|
fp = io.BytesIO(data)
|
||||||
|
|
||||||
|
with Image.open(fp) as im:
|
||||||
|
from . import TiffImagePlugin
|
||||||
|
|
||||||
|
if thumbnail_offset is None and isinstance(
|
||||||
|
im, TiffImagePlugin.TiffImageFile
|
||||||
|
):
|
||||||
|
im._frame_pos = [ifd_offset]
|
||||||
|
im._seek(0)
|
||||||
|
im.load()
|
||||||
|
child_images.append(im)
|
||||||
|
|
||||||
|
if offset is not None:
|
||||||
|
self.fp.seek(offset)
|
||||||
|
return child_images
|
||||||
|
|
||||||
def get_format_mimetype(self) -> str | None:
|
def get_format_mimetype(self) -> str | None:
|
||||||
if self.custom_mimetype:
|
if self.custom_mimetype:
|
||||||
return self.custom_mimetype
|
return self.custom_mimetype
|
||||||
|
|
Loading…
Reference in New Issue
Block a user