Любой способ сделать красивые сглаженные круглые углы для изображений в python?
Есть ли способ сделать хорошие круглые углы с помощью python? В настоящее время PIL и GD2 используются в моем проекте. Оба они имеют метод arc()
, который позволяет рисовать кватер-круг, но кватер-кружок не сглаживается, поэтому изображение выглядит хрустящим.
Есть ли какой-нибудь опрятный способ сделать сглаженные/гладкие круглые углы?
Ответы
Ответ 1
Итак, ладно, я нашел решение.
Я использовал метод суперсэмплинга bobince, предложенный ранее, но я обнаружил, что изображения становятся размытыми. Итак, я бы не предоставил полный код, но я объясню свое решение.
Это может показаться идиотским, но я не нашел другого способа сделать это без привлечения каких-либо других библиотек.
С PIL вы нарисовываете на изображении белый (или любой другой цвет, который вам нужен, включая прозрачные). Затем вы копируете его. Теперь у вас должно быть два изображения с хрустящими, не сглаженными белыми круглыми углами.
Теперь вы должны использовать суперсэмплинг scale-up → scale-down (см. выше bobince) для того, чтобы сделать одно из изображений плавным (я использовал масштабирование 8x).
Теперь у вас есть два изображения - один с хрустящими углами и другой с гладкими углами, но с размытым изображением.
Теперь вы должны сделать углы на хрустящем изображении прозрачными и вставить все изображение на гладкое. Для этого я использовал метод Image.composite(crispy_image, smooth_image, crispy_image) в библиотеке PIL.
Voila!
Ответ 2
Обычно я использую изображение как маску, например, такую как:
border.png
alt text http://nadiana.com/sites/default/files/pil_tutorial/border.png
border = Image.open('border.png')
source = border.convert('RGB')
img.paste(source, mask=border)
Маска может быть изменена в соответствии с размерами, которые вы хотите. Просто убедитесь, что вы используете метод Image.ANTIALIAS.
Вы можете обратиться к tutorial Я написал некоторое время назад для более подробной информации (бесстыдный плагин)
Если вы хотите больше контролировать размер и радиус, вам нужно использовать дугу или pieslice. Я не знаю о вас, но этот округленный прямоугольник, который я создал с PIL, выглядит достаточно гладко для меня:
alt text http://nadiana.com/sites/default/files/round_rectangle.png
Вот код, который я использовал для его рисования
Возможно, вам стоит проверить phatch: http://photobatch.wikidot.com/tutorials Он написан на Python и PIL и может применять круглые углы к фотографиям.
![alt text]()
Вот ссылка на код, используемый для применения круглых углов:
http://bazaar.launchpad.net/~stani/phatch/trunk/annotate/head:/phatch/actions/round.py
Это также выглядит достаточно гладко для меня.
Ответ 3
Вам нужно supersample: нарисуйте дугу на большее изображение и уменьшите ее.
например. белая, гладко полупрозрачная нижняя правая граница 16x16 с квадратной суперсэмплингом 4x4x:
>>> import Image, ImageDraw
>>> im= Image.new('RGBA', (16*4, 16*4), (255, 255, 255, 0))
>>> dr= ImageDraw.ImageDraw(im)
>>> dr.pieslice((-64, -64, 64, 64), 0, 340, fill=(255,255,255,255))
>>> im= im.resize((16, 16), Image.ANTIALIAS)
>>> im.save('border-se.png')
Ответ 4
Используйте алгоритм окружения Xiaolin Wu, как описано в Graphics Gems II. Краткое описание и пример (в php) можно найти здесь: http://create.stephan-brumme.com/antialiased-circle/
Что касается рисования дуги (частичная окружность), вы должны определить, находится ли данная точка в диапазоне дуги angular перед ее печатью.