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

У меня есть код на Python, который должен сделать с фотографиями всего пару простых вещей: обрезать, изменить размер и наложить водяной знак. Я использовал PIL, и результаты повторной выборки/изменения размера УЖАСНЫ. Я использовал imagemagick, и интерфейс и команды были разработаны путем упаковки кота в коробку, а затем многократного сбрасывания его по лестнице на клавиатуру.

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

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


person Paul McMillan    schedule 18.09.2009    source источник
comment
Вы будете искать некоторое время. PyMagick — единственная вещь, кроме PIL.   -  person Matthew Talbert    schedule 18.09.2009
comment
Как люди считают PIL приемлемым? Любая операция изменения размера (даже субдискретизация) приводит к артефактам и размытости, даже при установке передискретизации ANTIALIAS. Я часами пытался заставить его давать результаты, которые я бы принял, но по сравнению с настольными инструментами, такими как Photoshop или GIMP, изменение размера PIL выглядит жалко.   -  person Gabriel Hurley    schedule 18.09.2009
comment
Я использую изменение размера со сглаживанием для создания миниатюр для приложения для создания документов, и они сопоставимы с тем, что делает программа просмотра PDF в Acrobat.   -  person Anurag Uniyal    schedule 18.09.2009


Ответы (9)


Я использовал PIL, и результаты повторной выборки/изменения размера УЖАСНЫ.

Их не должно быть, если вы:

  1. использовать только фильтр Image.ANTIALIAS для операций уменьшения масштаба
  2. используйте только фильтр Image.BICUBIC для операций масштабирования.
  3. не забудьте преобразовать в цветовой режим «RGB» перед изменением размера, если вы используете изображение с палитрой
  4. не используйте .thumbnail(). это дерьмо
  5. установите уровень quality= на что-то подходящее при сохранении JPEG (по умолчанию довольно низкое)
person bobince    schedule 18.09.2009
comment
Вы знаете, после некоторого дополнительного тестирования результаты лучше при изменении размера, чем при уменьшении, даже если в обоих случаях используется алгоритм Image.ANTIALIAS. Если я подумаю об этом позже, я опубликую некоторые примеры результатов различных операций. - person Gabriel Hurley; 18.09.2009
comment
См. stackoverflow.com/questions/ 1386400/ — это не совсем тестирует подобное против похожего, но явно что-то не так с тем, что делает thumbnail(). - person bobince; 18.09.2009
comment
Просто хотел усилить пункт 5. Его легко пропустить, и это основная причина проблем, на которые изначально жаловался этот вопрос. - person Paul McMillan; 31.05.2011

Я не уверен, почему 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
person schickm    schedule 08.04.2011

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

person Ned Batchelder    schedule 18.09.2009
comment
Я всегда использовал его на обычных старых JPEG-файлах. Image.open('myfile.jpg'), затем Image.thumbnail или Image.resize, затем Image.save... Все с настройкой ANTIALIAS для понижения дискретизации. Это должно быть в режиме RGB по умолчанию (jpeg — это RGB) и с лучшим алгоритмом для понижения частоты дискретизации, верно? Если я что-то упускаю, я хотел бы знать, что я сделал не так... - person Gabriel Hurley; 18.09.2009
comment
Не видя исходный код и исходные изображения, трудно сказать, что происходит. Многие люди используют PIL для такой работы и довольны результатами. Что-то в вашем случае не так (у вас особенно орлиные глаза?), но мы пока не выяснили, что именно. - person Ned Batchelder; 18.09.2009

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

person John Paulett    schedule 18.09.2009

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

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

person tvon    schedule 18.09.2009

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

person ilya n.    schedule 18.09.2009
comment
К сожалению, для GIMP требуется GTK+, довольно глупая библиотека для установки на безголовый сервер. - person Paul McMillan; 21.01.2010

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

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

person James    schedule 09.10.2009

Я использовал PIL, и результаты повторной выборки/изменения размера УЖАСНЫ.

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

person homm    schedule 09.10.2016

В прошлый раз, когда я сравнивал, этот выход почти идентичен выходу «кубического» варианта 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

person Douglas Bagnall    schedule 07.06.2010