这是我遇到的问题:
我有一幅尺寸为3024 x 4032的图像,通常仅通过查看它就可以知道它是垂直图像,但这并不是出于任何原因。
from PIL import Image
img = Image.open("xxx.jpg")
print(img.size)
事实证明尺寸为(4032 x 3024),为什么?
在大多数情况下,它会按预期打印,其中维度的宽度为第一个参数( img.size[o]
),高度为第二个参数参数( img.size[1]
)。
看起来宽度和高度并不总是处于正确的位置吗?还是我错过了什么?
答案 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 docs到Image.size
图像大小,以像素为单位。大小以2元组(宽度,高度)给出。 类型:(宽度,高度)