在 Python 中首先是高度还是宽度?

height or width first in 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])。

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

来自 Pillow docs for Image.size

Image size, in pixels. The size is given as a 2-tuple (width, height). Type: (width, height)

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

有些手机和相机在用这个特殊的领域拍照的时候是"rotating"图像,并不是真正旋转图像的像素矩阵。 因此,在聪明的查看器程序中,您会看到图片的尺寸,因为它应该应用 exif 旋转,但 PIL 将加载它 "as is" 而不涉及任何旋转标签。

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

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