在Python中高度或宽度优先?

时间:2018-10-31 08:25:25

标签: python image python-imaging-library dimensions

这是我遇到的问题:

我有一幅尺寸为3024 x 4032的图像,通常仅通过查看它就可以知道它是垂直图像,但这并不是出于任何原因。 enter image description here

from PIL import Image

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

事实证明尺寸为(4032 x 3024),为什么?

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

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

2 个答案:

答案 0 :(得分:1)

您的图片可能会在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

答案 1 :(得分:0)

Pillow docsImage.size

  

图像大小,以像素为单位。大小以2元组(宽度,高度)给出。   类型:(宽度,高度)