10

我有 python 代码,只需要对照片做几件简单的事情:裁剪、调整大小和覆盖水印。我用过 PIL,重新采样/调整大小的结果很糟糕。我用过imagemagick,界面和命令的设计是把一只猫装在一个盒子里,然后用键盘反复把它扔下一组楼梯。

我正在寻找可以与 python 一起使用的不是 PIL 或 Imagemagick 的东西来进行简单、高质量的图像转换。就此而言,如果命令行界面良好,它甚至不必具有 python 绑定。

哦,它需要与平台无关,我们的生产服务器是 linux,但我们的一些开发人员在 Windows 上开发。它也不需要安装一堆愚蠢的 gui 代码来用作库。

4

9 回答 9

18

我用过 PIL,重新采样/调整大小的结果很糟糕。

他们不应该是,只要你:

  1. 仅使用 Image.ANTIALIAS 过滤进行缩小操作
  2. 仅使用 Image.BICUBIC 过滤进行放大操作。
  3. 如果您使用调色板图像,请记住在调整大小之前转换为“RGB”颜色模式
  4. 不要使用 .thumbnail()。这是废话
  5. 保存 JPEG 时将级别设置quality=为适当的值(默认值很低)
于 2009-09-18T00:37:44.803 回答
2

我不确定为什么 Image.thumbnail 会受到如此抨击。在我正在使用它的当前版本中,它只不过是找出所需的大小并调整图像的大小。只要您使用正确的重采样过滤器并首先转换为 RGB(如 bobince 所说),缩略图不应与调整大小有任何不同。

这是缩略图方法的实际来源:

def thumbnail(self, size, resample=NEAREST):
  # preserve aspect ratio
  x, y = self.size
  if x > size[0]: y = max(y * size[0] / x, 1); x = size[0]
  if y > size[1]: x = max(x * size[1] / y, 1); y = size[1]
  size = x, y

  if size == self.size:
      return

  self.draft(None, size)

  self.load()

  try:
      im = self.resize(size, resample)
  except ValueError:
      if resample != ANTIALIAS:
          raise
      im = self.resize(size, NEAREST) # fallback

  self.im = im.im
  self.mode = im.mode
  self.size = size

  self.readonly = 0
于 2011-04-08T17:01:52.860 回答
1

PIL 可以很好地调整大小。确保您的源图像处于 RGB 模式,而不是调色板颜色,并尝试不同的算法选择。

于 2009-09-18T00:17:46.133 回答
1

虽然 imagemagick 似乎是事实上的开源图像库,但可能是DevIL(跨平台,似乎做简单的图像操作)或FreeImage

于 2009-09-18T00:25:12.313 回答
1

你检查过pypi吗?粗略的搜索显示了一些与图像相关的工具,我还发现了 python-gd,但不知道它有多大用处。

我自己从来没有对 PIL 有任何问题,但某种多样性可能会很有趣。

于 2009-09-18T00:53:31.090 回答
1

我认为 GIMP 有一个合理的命令行界面。

于 2009-09-18T02:10:00.747 回答
1

看看其中一些图像库:

hxxp://pypi.python.org/pypi/collective.croppingimagefield/0.1beta

hxxp://pypi.python.org/pypi/cropresize/0.1.1

hxxp://pypi.python.org/pypi/image_resize/1.0

于 2009-10-09T19:03:58.513 回答
1

我用过 PIL,重新采样/调整大小的结果很糟糕。

在 PIL 中调整大小在很多方面都被破坏了,并且 PIL 很长时间没有维护。从Pillow 2.7开始,大多数问题都得到了修复,性能也得到了显着提升。确保您使用的是最新的 Pillow

于 2016-10-09T11:03:48.633 回答
0

上次我比较时,这个降频器的输出几乎与 GIMP 的“立方”选项相同:

 import Image

 def stretch(im, size, filter=Image.NEAREST):
     im.load()
     im = im._new(im.im.stretch(size, filter))
     return im

IIRC,这些差异在视觉上无法区分——由于四舍五入,一些像素值 +/-1,而且它们往往是围绕边缘的。它也不慢。

参考:http : //www.mail-archive.com/image-sig@python.org/msg00248.html

于 2010-06-07T00:13:36.057 回答