Альтернативы визуализации Python

У меня есть код python, который нужно делать всего лишь несколько простых вещей для фотографий: обрезка, изменение размера и наложение водяного знака. Я использовал PIL, и результаты resample/resize TERRIBLE. Я использовал imagemagick, и интерфейс и команды были разработаны путем упаковки кошки в коробке, а затем многократно бросали ее вниз по лестнице с клавиатуры.

Я ищу что-то, что не является PIL или Imagemagick, что я могу использовать с python для простых и качественных преобразований изображений. В этом случае, даже если для интерфейса командной строки это хорошо, ему даже не нужно иметь привязки python.

О, и это должно быть относительно агностически, наши производственные серверы - это Linux, но некоторые из наших разработчиков разрабатываются на окнах. Он не может требовать установки кучи глупого кода gui для использования в качестве библиотеки.

Ответ 1

Я использовал PIL, и результаты resample/resize TERRIBLE.

Их не должно быть, пока вы:

  • использовать только фильтрацию изображений. ANTIALIAS для операций масштабирования.
  • использовать только фильтрацию изображения .BICUBIC для операций масштабирования.
  • не забудьте преобразовать в режим "RGB" перед изменением размера, если вы используете палитру изображения
  • не используйте .thumbnail(). это дерьмо
  • установите для уровня quality= что-то подходящее при сохранении JPEG (по умолчанию довольно низкое)

Ответ 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

Ответ 3

PIL может производить хорошее изменение размера. Убедитесь, что исходное изображение находится в режиме RGB, а не в цветовых палитрах и попробуйте различные варианты выбора.

Ответ 4

Хотя imagemagick, по-видимому, является де-факто библиотекой изображений с открытым исходным кодом, возможно DevIL (кросс-платформа, похоже, выполняет простые операции с изображениями) или FreeImage.

Ответ 5

Вы отметили pypi? Беглый поиск показывает некоторые инструменты, связанные с изображением, я также обнаружил python-gd, не знаю, насколько это было бы полезно.

У меня никогда не было проблем с PIL, но может быть интересен какой-то сорт.

Ответ 6

У GIMP есть разумный интерфейс командной строки, я думаю.

Ответ 7

Взгляните на некоторые из этих библиотек изображений:

hxxp://pypi.python.org/pypi/collective.croppingimagefield/0.1beta​​p >

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

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

Ответ 8

В прошлый раз, когда я сравнивал, этот вывод уменьшителя почти идентичен выходу GIMP "кубический":

 import Image

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

IIRC, различия визуально неразличимы - некоторые значения пикселей +/- 1 из-за округления, и они, как правило, обходят края. Это тоже не замедляет.

cf: http://www.mail-archive.com/[email protected]/msg00248.html

Ответ 9

Я использовал PIL, и результаты resample/resize TERRIBLE.

Изменение размера в PIL было нарушено во многих отношениях, и PIL не поддерживается в течение длительного времени. Начиная с Pillow 2.7 устранены проблемы, а также значительное улучшение производительности. Убедитесь, что вы используете последнюю подушку.