在 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
这是我 运行 遇到的问题:
我有一张尺寸为 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