Масштабировать изображения с помощью 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 'ответ

Ответы на вопрос(4)

Ваш ответ на вопрос