From 4fa160259deaeca196453947ba62bc319b6bf151 Mon Sep 17 00:00:00 2001 From: mara004 Date: Sun, 25 Aug 2024 17:52:38 +0200 Subject: [PATCH] Slightly simplify the getexif procedure No need for a loop here either. Note that you could also use a dictionary rather than an if-elif tree for the value -> rotation mapping (where valid/supported). --- src/img2pdf.py | 73 +++++++++++++++++++++++++------------------------- 1 file changed, 37 insertions(+), 36 deletions(-) diff --git a/src/img2pdf.py b/src/img2pdf.py index f89670b..f219fdb 100755 --- a/src/img2pdf.py +++ b/src/img2pdf.py @@ -22,7 +22,7 @@ import sys import os import zlib import argparse -from PIL import Image, TiffImagePlugin, GifImagePlugin, ImageCms +from PIL import Image, TiffImagePlugin, GifImagePlugin, ImageCms, ExifTags if hasattr(GifImagePlugin, "LoadingStrategy"): # Pillow 9.0.0 started emitting all frames but the first as RGB instead of @@ -1372,41 +1372,42 @@ def get_imgmetadata( rotation = 0 if rotreq in (None, Rotation.auto, Rotation.ifvalid): - if hasattr(imgdata, "_getexif") and imgdata._getexif() is not None: - for tag, value in imgdata._getexif().items(): - if TAGS.get(tag, tag) == "Orientation": - # Detailed information on EXIF rotation tags: - # http://impulseadventure.com/photo/exif-orientation.html - if value == 1: - rotation = 0 - elif value == 6: - rotation = 90 - elif value == 3: - rotation = 180 - elif value == 8: - rotation = 270 - elif value in (2, 4, 5, 7): - if rotreq == Rotation.ifvalid: - logger.warning( - "Unsupported flipped rotation mode (%d): use " - "--rotation=ifvalid or " - "rotation=img2pdf.Rotation.ifvalid to ignore", - value, - ) - else: - raise ExifOrientationError( - "Unsupported flipped rotation mode (%d): use " - "--rotation=ifvalid or " - "rotation=img2pdf.Rotation.ifvalid to ignore" % value - ) - else: - if rotreq == Rotation.ifvalid: - logger.warning("Invalid rotation (%d)", value) - else: - raise ExifOrientationError( - "Invalid rotation (%d): use --rotation=ifvalid " - "or rotation=img2pdf.Rotation.ifvalid to ignore" % value - ) + exif_dict = imgdata.getexif() + o_key = ExifTags.Base.Orientation.value # 274 rsp. 0x112 + if exif_dict and o_key in exif_dict: + # Detailed information on EXIF rotation tags: + # http://impulseadventure.com/photo/exif-orientation.html + value = exif_dict[o_key] + if value == 1: + rotation = 0 + elif value == 6: + rotation = 90 + elif value == 3: + rotation = 180 + elif value == 8: + rotation = 270 + elif value in (2, 4, 5, 7): + if rotreq == Rotation.ifvalid: + logger.warning( + "Unsupported flipped rotation mode (%d): use " + "--rotation=ifvalid or " + "rotation=img2pdf.Rotation.ifvalid to ignore", + value, + ) + else: + raise ExifOrientationError( + "Unsupported flipped rotation mode (%d): use " + "--rotation=ifvalid or " + "rotation=img2pdf.Rotation.ifvalid to ignore" % value + ) + else: + if rotreq == Rotation.ifvalid: + logger.warning("Invalid rotation (%d)", value) + else: + raise ExifOrientationError( + "Invalid rotation (%d): use --rotation=ifvalid " + "or rotation=img2pdf.Rotation.ifvalid to ignore" % value + ) elif rotreq in (Rotation.none, Rotation["0"]): rotation = 0 elif rotreq == Rotation["90"]: