Миниатюра PIL вращает мое изображение? - PullRequest
40 голосов
/ 19 ноября 2010

Я пытаюсь взять большие (огромные) изображения (с цифровой камеры) и преобразовать их во что-то, что я могу показать в Интернете.Это кажется простым и, вероятно, должно быть.Однако, когда я пытаюсь использовать PIL для создания миниатюрных версий, если мое исходное изображение выше, чем его ширина, результирующее изображение поворачивается на 90 градусов, так что верхняя часть исходного изображения находится слева от полученного изображения.Если исходное изображение шире, чем оно высокое, полученное изображение имеет правильную (исходную) ориентацию.Может ли это быть связано с 2-мя кортежами, которые я посылаю в качестве размера?Я использую миниатюру, потому что, похоже, она должна была сохранить соотношение сторон.Или я просто полностью ослеп и делаю что-то глупое?Размер кортежа равен 1000, 1000, потому что я хочу, чтобы самая длинная сторона была сокращена до 1000 пикселей, сохраняя при этом AR.

Код кажется простым

img = Image.open(filename)
img.thumbnail((1000,1000), Image.ANTIALIAS)
img.save(output_fname, "JPEG")

Заранее благодарен за любую помощь.

Ответы [ 11 ]

0 голосов
/ 13 апреля 2017

Здесь есть несколько хороших ответов, я просто хотел опубликовать очищенную версию ... Функция предполагает, что вы уже выполнили Image.open () где-то, и будете делать image.save () в другом месте и просто хотитеФункция, которую вы можете зайти, чтобы исправить вращение.

def _fix_image_rotation(image):
 orientation_to_rotation_map = {
     3: Image.ROTATE_180,
     6: Image.ROTATE_270,
     8: Image.ROTATE_90,
 }
 try:
     exif = _get_exif_from_image(image)
     orientation = _get_orientation_from_exif(exif)
     rotation = orientation_to_rotation_map.get(orientation)
     if rotation:
         image = image.transpose(rotation)

 except Exception as e:
     # Would like to catch specific exceptions, but PIL library is poorly documented on Exceptions thrown
     # Log error here

 finally:
     return image


def _get_exif_from_image(image):
 exif = {}

 if hasattr(image, '_getexif'):  # only jpegs have _getexif
     exif_or_none = image._getexif()
     if exif_or_none is not None:
         exif = exif_or_none

 return exif


def _get_orientation_from_exif(exif):
 ORIENTATION_TAG = 'Orientation'
 orientation_iterator = (
     exif.get(tag_key) for tag_key, tag_value in ExifTags.TAGS.items()
     if tag_value == ORIENTATION_TAG
 )
 orientation = next(orientation_iterator, None)
 return orientation
...