Изменение размера прозрачного png с помощью библиотеки изображений Python и эффекта ореола

Есть пара похожих вопросов по SO, но ни один из них не помог. В основном я пытаюсь изменить размер простого изображения png, как показано здесь:

http://media.spiralknights.com/wiki-images/3/3e/Equipment-Proto_Sword_icon.png (из mmo Spiral Knights, авторское право Three Rings Entertainment)

Первоначально я реализовал утилиту, которая использует эти изображения в php, и утилита изменения размера там работала отлично. Я использовал метод, описанный на странице imagecopyresampled в документации PHP.

Честно говоря, я даже не могу заставить его изменить размер лучше в Photoshop, но результаты почти катастрофические в python. Я постоянно получаю эффект ореола, и я считаю, что это, по крайней мере, частично соответствует фактическим значениям RGBA прозрачных пикселей. Вот эта картинка говорит об этом лучше:

resize examples

(предпоследнее изменение размера было просто предложением, которое я видел на другом форуме, чтобы сначала изменить размер в два раза больше окончательного, и это ДЕЙСТВИТЕЛЬНО помогло, по крайней мере, немного, но недостаточно)

При изменении размера изображение уже находится в режиме RGBA.

Как видите, изменения размеров PHP и Photoshop не содержат ореолов. Честно говоря, все, кроме изменения размера PHP, делает СЛИШКОМ много работы, мне нравится минимальная палитра в изображении php (если вы посмотрите на более крупные версии, вы увидите, что изменение размера PHP использует меньше между цветами), но я мог бы жить с тем, как Photoshop изменил его размер, или даже внутреннюю часть питона изменил размер, но ореол недопустим.

Мне кажется - поправьте меня, если я ошибаюсь, - что PHP и Photoshop, похоже, знают, что при интерполяции не следует использовать цвет пикселей в альфа-канале, но python использует эту светлую границу, которая в противном случае является прозрачным по своему размеру.

К сожалению, есть много разных иконок, размер которых мне нужно изменить, с разными профилями, поэтому они не все такие простые, как этот круглый, но это был только первый, который я использовал во время экспериментов.

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

>> import Image
>> img = Image.open('swordorig.png')
>> img

>> img.resize((36,36), Image.ANTIALIAS).save('swordresize.png')

Возможный вопрос: есть ли способ сказать PIL НЕ использовать цвет пиксель с альфа-каналом, равным 0, при передискретизации?

6
задан reclosedev 4 February 2012 в 17:43
поделиться