Найти - Пользователи
Полная версия: PIL и геометрическая трансформация изображения
Начало » Центр помощи » PIL и геометрическая трансформация изображения
1 2
Ska1n
Добрый день, подскажите, пожалуйста, с PIL только начал знакомиться, какими функциями можно реализовать следующее: хочется посредством PIL делать различного рода редактирования изображений, напоминающим функцию Distort в фотошопе - когда можно изображение тянуть по краям и текстура изображения будет либо сужаться, либо растягивать, прикрепил пример: вверху стандартная картинка, а внизу измененная.
Ska1n
нагуглил, что нужно смотреть в сторону, что-то типа такого
im.transform((1000,1000),Image.PERSPECTIVE ,(1, 0, 0, 0, 1, -100,0, .001))
но с просчетами у меня увы туго, уровень знаний математики остался еще в далеком 7 классе… может есть какая-нибудь прога, в который выставляешь перспективу, а она тебе точки в цифрах? для аффинных преобразований нашел вот такое - http://www.senocular.com/flash/tutorials/transformmatrix/, а вот для перспективы бы… в гимпе есть возможность выстроить перспективу и показывает 9 точек, но, выставляя их в свой код и используя на своем примере, получается совершенно не то =\
Ska1n
вопрос решил методом перебора значений через явасрипт, но встал другой вопрос: какие лучше применить фильтры, чтобы качество картинки было приемлемым? у меня картинки в png формате, с прозрачным альфа-каналом. Допустим, в фотошопе изменяя, границы мягко смазываются и не так сильно искажает качество, как в PILe… пробовал связку DETAIL + SMOOTH, но все равно не ахти( может у кого есть решения?
reclosedev
Покажите код.
Подозреваю, что вы используете
Ska1n
пробовал связку DETAIL + SMOOTH
уже после того как изображение испорчено.

Image.transfom() принимает аргумент filter, который по умолчанию NEAREST - самый быстрый, но качество плохое. Можно попробовать BICUBIC или BILINEAR, и решить, что больше подходит.
import Image
 
img = Image.open('test.png')
w, h = img.size
for mode in ('NEAREST', 'BILINEAR', 'BICUBIC'):
    new = img.transform((w * 2, h * 2),
                         Image.PERSPECTIVE,
                         (1, 0, 0, 0, 1, -100,0, .001),
                         getattr(Image, mode))
    new.save('test_%s.png' % mode)
Ska1n
так точно, применял фильтр после искажений изображения

a = float(request.POST['a'])
b = float(request.POST['b'])
c = float(request.POST['c'])
d = float(request.POST['d'])
e = float(request.POST['e'])
f = float(request.POST['f'])
g = float(request.POST['g'])
h = float(request.POST['h'])
im = Image.open("/home/www/html/Piltest/test.png")
out = im.transform(im.size,Image.PERSPECTIVE ,(a,b,c,d,e,f,g,h)).filter(ImageFilter.DETAIL).filter(ImageFilter.SMOOTH_MORE)
    
out.save("/home/www/html/files/test_tmp.png", "PNG")
опробовал по вашему, бикубик подошел лучше остальных, благодарю за помощь.
В довесок можно еще вопрос? в какую степь глядеть: нужно в изображение сделать 2-3 прямоугольных дыры (в виде альфа-каналов), через ПИЛ это возможно?
reclosedev
Ska1n
В довесок можно еще вопрос? в какую степь глядеть: нужно в изображение сделать 2-3 прямоугольных дыры (в виде альфа-каналов), через ПИЛ это возможно?
http://stackoverflow.com/questions/4379978/python-pil-how-to-make-area-transparent-in-png
Ska1n
шикарно, спасибо большое
Ska1n
всплыла одна проблема: имеется прозрачная png картинка, при добавление прямоугольников и с последующей закраской их. теряется прозрачность оставшегося прозрачного куска, как-то можно это избежать?
reclosedev
Код?
Ska1n
im = Image.open("One.png")
transparent_area = (tmp_s.param11,tmp_s.param12,tmp_s.param13,tmp_s.param14)
mask=Image.new('L', im.size, color=255)
draw=ImageDraw.Draw(mask)
draw.rectangle(transparent_area, fill=0)
im.putalpha(mask)
out = im.transform(im.size,Image.PERSPECTIVE ,(persp1),getattr(Image, 'BICUBIC'))
out.save("two.png", "PNG")
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB