Библиотека изображений Python: чистая даунсэмплинг - PullRequest
2 голосов
/ 29 октября 2011

У меня возникли проблемы при попытке получить PIL для качественного уменьшения изображений.В данном случае цель заключается в том, чтобы мой веб-сайт автоматически уменьшал выборку-> кэшировал исходный файл изображения всякий раз, когда требуется другой размер, таким образом устраняя необходимость в поддержке нескольких версий одного и того же изображения.Однако мне не повезло.Я пробовал:

image.thumbnail((width, height), Image.ANTIALIAS)
image.save(newSource)

и

image.resize((width, height), Image.ANTIALIAS).save(newSource)

и

ImageOps.fit(image, (width, height), Image.ANTIALIAS, (0, 0)).save(newSource)

, и все они, похоже, выполняют ближайший соседний сэмплирование, а не усреднениепо пикселям, как и должно. Следовательно, он превращает изображения вроде

http://www.techcreation.sg/media/projects//software/Java%20Games/images/Tanks3D%20Full.png

в

http://www.techcreation.sg/media/temp/0x5780b20fe2fd0ed/Tanks3D.png

, что не очень приятно.Кто-нибудь еще сталкивался с этой проблемой?

Ответы [ 2 ]

4 голосов
/ 29 октября 2011

Это изображение является индексированным цветом (в палитре или в режиме P). Существует очень ограниченное количество цветов, с которыми можно работать, и маловероятно, что пиксель из измененного изображения будет находиться в палитре, поскольку ему потребуется много промежуточных цветов. Таким образом, он всегда использует режим ближайшего соседа при изменении размера; это действительно единственный способ сохранить ту же палитру.

Это поведение такое же, как в Adobe Photoshop.

Сначала необходимо перейти в режим RGB и изменить его размер, а затем вернуться в режим палитры перед сохранением, если это необходимо. (На самом деле я просто сохранил бы его в режиме RGB, а затем отключил PNGCrush в папке изображений с измененным размером.)

2 голосов
/ 03 ноября 2012

Это больше года, но если кто-то еще ищет:

Вот пример кода, который покажет, находится ли изображение в режиме палитры, и внесет коррективы

 import Image # or from PIL import Image
 img = Image.open(sourceFile)
 if 'P' in img.mode: # check if image is a palette type
     img = img.convert("RGB") # convert it to RGB
     img = img.resize((w,h),Image.ANTIALIAS) # resize it
     img = img.convert("P",dither=Image.NONE, palette=Image.ADAPTIVE) 
           #convert back to palette
 else:
     img = img.resize((w,h),Image.ANTIALIAS) # regular resize
 img.save(newSourceFile) # save the image to the new source
 #img.save(newSourceFile, quality = 95, dpi=(72,72), optimize = True) 
    # set quality, dpi , and shrink size

Преобразовав версию с палитрой в RGB, мы можем изменить ее размер с помощью псевдонима.Если вы хотите восстановить его обратно, то вам нужно установить дизеринг на NONE и использовать палитру ADAPTIVE.Если параметры не включены, ваш результат (если он преобразован в палитру) будет зернистым.Также вы можете использовать параметр качества в функции сохранения для некоторых форматов изображений, чтобы еще больше улучшить качество.

...