Альтернативы Python для обработки изображений - PullRequest
10 голосов
/ 18 сентября 2009

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

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

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

Ответы [ 9 ]

18 голосов
/ 18 сентября 2009

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

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

  1. использовать только фильтрацию Image.ANTIALIAS для операций уменьшения масштаба
  2. использовать только фильтр Image.BICUBIC для операций масштабирования.
  3. не забудьте преобразовать в цветной режим 'RGB' перед изменением размера, если вы используете изображение с палитрой
  4. не используйте .thumbnail (). это дерьмо
  5. установить уровень quality= на что-то подходящее при сохранении JPEG (по умолчанию довольно низкий)
2 голосов
/ 08 апреля 2011

Я не уверен, почему Image.thumbnail получает такую ​​ошибку. В текущем выпуске, который я использую, он делает чуть больше, чем вычисляет желаемый размер и изменяет размер изображения на месте. Пока вы используете надлежащий фильтр сэмплирования и сначала конвертируете в RGB (как говорит Бобинс), миниатюра не должна отличаться от изменения размера.

Вот фактический источник для метода миниатюр:

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
1 голос
/ 09 октября 2009

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

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

1 голос
/ 18 сентября 2009

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

1 голос
/ 18 сентября 2009

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

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

1 голос
/ 18 сентября 2009

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

1 голос
/ 18 сентября 2009

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

0 голосов
/ 09 октября 2016

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

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

0 голосов
/ 07 июня 2010

В прошлый раз, когда я сравнивал, вывод этого даунскейлера почти идентичен выводу 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/image-sig@python.org/msg00248.html

...