Как настроить качество изображения с измененным размером в Python Imaging Library? - PullRequest
52 голосов
/ 10 сентября 2009

Я работаю над PIL и мне нужно знать, можно ли настроить качество изображения при изменении размера или уменьшении изображения. Из того, что я знаю, качество по умолчанию установлено на 85. Можно ли настроить этот параметр во время изменения размера?

В настоящее время я использую следующий код:

image = Image.open(filename)
image.thumbnail((x, y), img.ANTIALIAS)

Параметр ANTIALIAS, по-видимому, дает наилучшее качество. Мне нужно знать, сможем ли мы получить более детализированный выбор качества.

Ответы [ 5 ]

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

Используйте метод PIL's resize вручную:

image = image.resize((x, y), Image.ANTIALIAS)  # LANCZOS as of Pillow 2.7

Далее следует метод сохранения

quality_val = 90
image.save(filename, 'JPEG', quality=quality_val)

Посмотрите на источник для models.py от Photologue, чтобы увидеть, как они это делают.

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

ANTIALIAS никоим образом не сопоставимы с уровнем качества "85". Параметр ANTIALIAS сообщает методу миниатюр, какой алгоритм использовать для повторной выборки пикселей из одного размера в другой. Например, если у меня есть изображение 3х3, которое выглядит так:

2 2 2
2 0 2
2 2 2

и я изменяю его размер до 2x2, один алгоритм может дать мне:

2 2
2 2

потому что большинство пикселей рядом - 2 с, а другой может дать мне:

1 1
1 1

, чтобы учесть 0 в середине. Но вы все еще не начали иметь дело со сжатием, и не будете, пока вы не сохраните изображение. То есть при миниатюре вы имеете дело не с градациями качества, а с дискретными алгоритмами повторной выборки. Так что нет, вы не можете получить более полный контроль здесь.

Если вы сохраняете в формате со сжатием с потерями, это место для указания уровней качества.

11 голосов
/ 20 октября 2010

Не путайте масштабирование и сжатие.

Для наилучшего качества вы должны использовать оба. Смотрите следующий код:

from PIL import Image

image = Image.open(filename)
image.thumbnail((x, y), Image.ANTIALIAS)
image.save(filename, quality=100)

Таким образом, у меня очень хорошие пальцы в моих программах.

1 голос
/ 01 апреля 2014

Antialias n установить качество, как 90

   img = img.resize((128,128),Image.ANTIALIAS)
   img.save(os.path.join(output_dir+'/'+x,newfile),"JPEG",quality=90)

http://www.dzone.com/snippets/resize-thousands-images-python

0 голосов
/ 16 ноября 2011

Одним из способов достижения лучшего качества является уменьшение масштаба в два этапа. Например, если исходное изображение имеет размер 1200x1200 и вам необходимо изменить его размер до 64x64 пикселей, то на первом этапе уменьшите его до середины этих двух размеров:

1200x1200 -> 600x600 -> 64x64

...