Масштабировать изображения с помощью PIL, сохраняя прозрачность и цвет?
Скажем, вы хотите масштабировать прозрачное изображение, но еще не знаете цвет фона, на который вы будете накладывать его позже. К сожалению, PIL, похоже, включает в себя значения цвета полностью прозрачных пикселей, что приводит к плохим результатам. Есть ли способ указать PIL-resize игнорировать полностью прозрачные пиксели?
import PIL.Image
filename = "trans.png" # http://qrc-designer.com/stuff/trans.png
size = (25,25)
im = PIL.Image.open(filename)
print im.mode # RGBA
im = im.resize(size, PIL.Image.LINEAR) # the same with CUBIC, ANTIALIAS, transform
# im.show() # does not use alpha
im.save("resizelinear_"+filename)
# PIL scaled image has dark border
исходное изображение с (0,0,0,0) (черный, но полностью прозрачный) фоном (слева)
выходное изображение с черным ореолом (посередине)
правильный вывод масштабируется с GIMP (справа)
редактировать: похоже, чтобы достичь того, что я ищу, мне нужно изменить выборку самой функции изменения размера так, чтобы она игнорировала пиксели с полной прозрачностью.
edit2: я нашел очень некрасивое решение. Он устанавливает значения цвета полностью прозрачных пикселей на среднее значение окружающих непрозрачных пикселей, чтобы минимизировать влияние полностью прозрачных цветов пикселей при изменении размера. Это медленно в простой форме, но я опубликую это, если нет другого решения. Может быть возможно сделать это быстрее, используя операцию расширения для обработки только необходимых пикселей.
edit3: предварительно умноженная альфа - способ пойти - см. Mark 'ответ