如何使用 PIL 获取图片大小?

Posted

技术标签:

【中文标题】如何使用 PIL 获取图片大小?【英文标题】:How do I get the picture size with PIL? 【发布时间】:2011-09-20 15:13:23 【问题描述】:

如何使用 PIL 或任何其他 Python 库获取图片边的大小?

【问题讨论】:

另见:image size in bytes 【参考方案1】:
from PIL import Image

im = Image.open('whatever.png')
width, height = im.size

根据documentation.

【讨论】:

如果你也想知道频道的数量,你应该使用im.mode。由于PIL有点神秘,你也可以使用numpy:numpy.array(im).shape 注意@AlexKreimer 使用.shape 会导致不同的返回,因为高度是二维数组的第一个,然后是宽度。因此height, width = np.array(im).shape 请使用with @AlexKreimer : np.array(im).shape 不返回频道数,而是返回heightwidth 值得注意的是,Image.open() 读取元数据而不加载完整图像,这可能有优点(更快)或缺点(重复),具体取决于您的用例。使用Image.load() 阅读完整图像。 ***.com/a/19034942/1295595【参考方案2】:

您可以使用枕头(Website、Documentation、GitHub、PyPI)。 Pillow 具有与 PIL 相同的界面,但适用于 Python 3。

安装

$ pip install Pillow

如果你没有管理员权限(Debian 上的 sudo),你可以使用

$ pip install --user Pillow

有关安装的其他注意事项是here。

代码

from PIL import Image
with Image.open(filepath) as img:
    width, height = img.size

速度

30336 张图片需要 3.21 秒(JPG 从 31x21 到 424x428,训练数据来自 Kaggle 上的 National Data Science Bowl)

这可能是使用 Pillow 而不是自己编写的东西的最重要原因。您应该使用 Pillow 而不是 PIL(python-imaging),因为它适用于 Python 3。

替代方案 #1:Numpy(已弃用)

我保留scipy.ndimage.imread,因为信息仍然存在,但请记住:

imread 已弃用! imread 在 SciPy 1.0.0 中已弃用,并在 1.2.0 中[已] 删除。

import scipy.ndimage
height, width, channels = scipy.ndimage.imread(filepath).shape

替代方案 #2:Pygame

import pygame
img = pygame.image.load(filepath)
width = img.get_width()
height = img.get_height()

【讨论】:

Image.open(filepath)cv2.imread(filepath) 方法快吗?【参考方案3】:

由于scipyimread 已弃用,请使用imageio.imread

    安装 - pip install imageio 使用height, width, channels = imageio.imread(filepath).shape

【讨论】:

imageio 基于 Pillow 并为不同的文件格式提供通用 API。所以性能应该和 Pillow 差不多。【参考方案4】:

这是一个从 URL 加载图像、使用 PIL 创建、打印大小和调整大小的完整示例...

import requests
h =  'User-Agent': 'Neo'
r = requests.get("https://images.freeimages.com/images/large-previews/85c/football-1442407.jpg", headers=h)

from PIL import Image
from io import BytesIO
# create image from binary content
i = Image.open(BytesIO(r.content))


width, height = i.size
print(width, height)
i = i.resize((100,100))
display(i)

【讨论】:

【参考方案5】:

以下是在 Python 3 中从给定 URL 获取图像大小的方法:

from PIL import Image
import urllib.request
from io import BytesIO

file = BytesIO(urllib.request.urlopen('http://getwallpapers.com/wallpaper/full/b/8/d/32803.jpg').read())
im = Image.open(file)
width, height = im.size

【讨论】:

【参考方案6】:

请注意,PIL 不会应用 EXIF 旋转信息(至少到 v7.1.1;在许多 jpg 中使用)。快速解决此问题:

def get_image_dims(file_path):
    from PIL import Image as pilim
    im = pilim.open(file_path)
    # returns (w,h) after rotation-correction
    return im.size if im._getexif().get(274,0) < 5 else im.size[::-1]

【讨论】:

【参考方案7】:

以下提供维度和渠道:

import numpy as np
from PIL import Image

with Image.open(filepath) as img:
    shape = np.array(img).shape

【讨论】:

以上是关于如何使用 PIL 获取图片大小?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 PIL 减小图像文件大小

在 geoTIFF 中获取所有唯一颜色时,如何知道 PIL 指的是啥颜色?

pgmagick,pil不保存图片并且获取图片二进制数据记录

如何使用 PIL 将 PNG 图像写入字符串?

Python 细聊一下可以媲美 PS 的 PIL 图片处理库

如何使用 Python PIL 或 CV 裁剪图像?