python - 在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]
。
看起来宽度和高度并不总是在正确的位置?还是我错过了什么?
解决方案
您的图片可能会在 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
推荐阅读
- angular-material - Angular mat-sidenav 属性 isHandset$ | 异步解释
- javascript - 循环遍历音频元素的 JavaScript 数组
- python - TensorFlow 不使用 GPU
- apache-spark - Spark Streaming 2.3.1 类型转换:字符串到时间戳
- ios - 点击按钮后 UIAppearance 主题不适用于 VC
- primeng - p-paginator 是如何工作的
- java - jtable 仅使用来自链接列表的值填充一行
- python - Django在scrapy完成后重定向到结果页面
- c++ - CLS 达到性能
- javascript - 在 puppeteer 解决特定事件的承诺