智能地确定Python中的图像大小

时间:2016-09-28 14:18:43

标签: python image-processing python-imaging-library

我想用Python智能地选择图片的尺寸(以英寸为单位)。如果我手动执行此操作,我会在某些照片编辑软件中打开图片并调整图像大小,直到它看起来“好”为止。

我在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)]

这让我觉得非常低效,我希望有更多经验的人有更聪明的方法。

2 个答案:

答案 0 :(得分:1)

忘了dpi。这是一个非常混乱的术语。除非你扫描\ print(即使用物理介质),否则这并不意味着什么。

良好的数字维度具有以下内容:

  • 最大因素2可能。这就是大多数标准数字分辨率(特别是视频中的大小为2 ^ 3或2 ^ 4)的原因。数字滤波器和变换利用这一优势进行优化
  • 源图像和目标图像之间的简单因素(同样主要是2)。将图像裁剪8倍几乎总能产生比裁剪7更好的效果。大部分时间它也会更快。
  • 有点标准长宽比。广场,4:3,16:9。
  • 取决于源图像的宽高比的情况保存。

这就是为什么很多网站都为你提供了一个可调整大小的矩形\方形框用于某些照片(如facebook个人资料图片),这将确保宽高比与处理过的图像相同,即最小\最大尺寸得到满足等等......

答案 1 :(得分:0)

我想我过早地问了一下。这更多地取决于理解分辨率与DPI,而不是编程。一旦我学到了更多,答案变得非常简单。数字图像具有分辨率,而打印图像具有DPI。要选择数字图像的大小,如果打印,该图像将具有300 DPI就像:pixel / 300一样简单。在PIL的特定情况下,以下代码可以正常工作:

import PIL

im = Image.open(im_name)
print_ready_width = im.size[0] / 300

如果在print_read_width打印,图像将具有300 DPI。

相关问题