首页 > 解决方案 > 在Python中首先是高度还是宽度?

问题描述

这是我遇到的问题:

我有一张尺寸为 3024 x 4032 的图像,通常只要看看它,你就知道它是垂直图像,但不是出于任何原因。 在此处输入图像描述

from PIL import Image

img = Image.open("xxx.jpg")
print(img.size)

原来是 (4032 x 3024) 的尺寸,这是为什么呢?

在大多数情况下,它会按预期打印出来,其中维度的第一个参数()是宽度,img.size[o]第二个参数()是高度img.size[1]

看起来宽度和高度并不总是在正确的位置?还是我错过了什么?

标签: pythonimagepython-imaging-librarydimensions

解决方案


您的图片可能会在 exif 标签中旋转。

一些手机和相机在通过这个特殊字段制作照片时是在“旋转”图像,而不是实际旋转图像的像素矩阵。因此,在聪明的查看器程序中,您将看到应用 exif 旋转的图片尺寸,但 PIL 将“按原样”加载它,而不涉及任何旋转标签。

因此,您可以检查图像是否旋转,然后交换宽度和高度:

from PIL import Image, ExifTags

img = Image.open("xxx.jpg")

def get_image_size(img):
    """
    The function return REAL size of image
    """

    # Lets get exif information in a form of nice dict:
    # It will be something like: {'ResolutionUnit': 2, 'Orientation': 6, 'YCbCrPositioning': 1}
    exif = {
        ExifTags.TAGS[k]: v
        for k, v in img._getexif().items()
        if k in ExifTags.TAGS
    }

    size = img.size

    # If orientation is horizontal, lets swap width and height:
    if exif.get("Orientation", 0) > 4:
        size = (size[1], size[0])

    return size

print(get_image_size(img))

Exif 方向是一个数字 1-8,表示真实图像方向

有关它的信息可以在这里找到:http ://sylvana.net/jpegcrop/exif_orientation.html


推荐阅读