在 Python 中智能确定图像大小
Intelligently Determine Image Size in Python
我想使用 Python 智能地选择图片的尺寸(以英寸为单位)。如果我手动执行此操作,我会在一些照片编辑软件中打开图片并调整图像大小,直到看起来 'good'。
我在 SO 上看到的其他答案都有预先指定的维度,但在这种情况下,这是我希望程序确定的。我对图像处理非常陌生,所以我犹豫要更具体。但是,我 认为 我想选择 DPI >= 300 的尺寸。所有这些图像最终都会打印出来,这就是为什么我将 DPI 作为衡量标准的原因。一个可怕的蛮力方式可能是:
from PIL import Image
import numpy as np
import bisect
min_size = 1
max_size = 10
sizes = np.linspace(min_size, max_size)
for size in sizes:
im = Image.open(im_name)
im.thumbnail((size, size), Image.ANTIALIAS) #assumes square images
dpi_vals.append(im.info['dpi']))
best_size = sizes[bisect.bisect(dpi_vals, 300)]
这让我觉得效率很低,我希望有更多经验的人有更聪明的方法。
忘记 dpi。这是一个非常混乱的术语。除非你scan\print(即使用物理媒介),否则这意义不大。
一个好的数字维度具有以下内容:
- 2 的最大因数。这就是为什么大多数标准数字分辨率(尤其是视频中的尺寸为 2^3 或 2^4 的倍数)的原因。数字滤波器和转换利用这一点进行优化
- 源图像和目标图像之间的一个简单因素(同样主要是 2)。将图像裁剪 8 倍几乎总是比裁剪 7 倍产生更好的结果。大多数时候它也会更快。
- 有点标准的纵横比。正方形,4:3,16:9。
- 视情况保存源图长宽比
这就是为什么许多网站为您提供可调整大小的 rectangle\square 框来容纳某些照片(例如 facebook 个人资料图片),这将确保纵横比与处理过的图像的纵横比相同,即满足 minimum\maximum 个维度,等等...
我想我问的有点早了。与编程相比,这更多地取决于对分辨率与 DPI 的理解。一旦我了解更多,答案就变得很容易了。数字图像具有分辨率,而印刷图像具有 DPI。要选择数字图像的大小,以便在打印时该图像具有 300 DPI,就像:像素 / 300 一样简单。在 PIL
的特定情况下,以下代码可以正常工作:
import PIL
im = Image.open(im_name)
print_ready_width = im.size[0] / 300
如果以 print_read_width
打印,图像将具有 300 DPI。
我想使用 Python 智能地选择图片的尺寸(以英寸为单位)。如果我手动执行此操作,我会在一些照片编辑软件中打开图片并调整图像大小,直到看起来 'good'。
我在 SO 上看到的其他答案都有预先指定的维度,但在这种情况下,这是我希望程序确定的。我对图像处理非常陌生,所以我犹豫要更具体。但是,我 认为 我想选择 DPI >= 300 的尺寸。所有这些图像最终都会打印出来,这就是为什么我将 DPI 作为衡量标准的原因。一个可怕的蛮力方式可能是:
from PIL import Image
import numpy as np
import bisect
min_size = 1
max_size = 10
sizes = np.linspace(min_size, max_size)
for size in sizes:
im = Image.open(im_name)
im.thumbnail((size, size), Image.ANTIALIAS) #assumes square images
dpi_vals.append(im.info['dpi']))
best_size = sizes[bisect.bisect(dpi_vals, 300)]
这让我觉得效率很低,我希望有更多经验的人有更聪明的方法。
忘记 dpi。这是一个非常混乱的术语。除非你scan\print(即使用物理媒介),否则这意义不大。
一个好的数字维度具有以下内容:
- 2 的最大因数。这就是为什么大多数标准数字分辨率(尤其是视频中的尺寸为 2^3 或 2^4 的倍数)的原因。数字滤波器和转换利用这一点进行优化
- 源图像和目标图像之间的一个简单因素(同样主要是 2)。将图像裁剪 8 倍几乎总是比裁剪 7 倍产生更好的结果。大多数时候它也会更快。
- 有点标准的纵横比。正方形,4:3,16:9。
- 视情况保存源图长宽比
这就是为什么许多网站为您提供可调整大小的 rectangle\square 框来容纳某些照片(例如 facebook 个人资料图片),这将确保纵横比与处理过的图像的纵横比相同,即满足 minimum\maximum 个维度,等等...
我想我问的有点早了。与编程相比,这更多地取决于对分辨率与 DPI 的理解。一旦我了解更多,答案就变得很容易了。数字图像具有分辨率,而印刷图像具有 DPI。要选择数字图像的大小,以便在打印时该图像具有 300 DPI,就像:像素 / 300 一样简单。在 PIL
的特定情况下,以下代码可以正常工作:
import PIL
im = Image.open(im_name)
print_ready_width = im.size[0] / 300
如果以 print_read_width
打印,图像将具有 300 DPI。