Форум сайта python.su
Есть проще решение, тут надыбал:
im = Image.open('mouse.png')
im = im.convert('RGB').convert('P', palette=Image.ADAPTIVE)
# The white index in the palette of this image is 255
im.save('mouse.gif', transparency=255)
Офлайн
да, спасибо, полезная ссылка..
работает, правда качество значительно теряется: из PNG 24 в GIF :)
и, как выясняется, надо не только белый (255,255,255) определить прозрачным, но и ближайшие оттенки…
поэтому, буду пробовать как-то через поинт делать… отпишу по результату, но всегда буду рад помощи…
Офлайн
поспешил с ответом, по вашей ссылке многое проясняется ))
спасибо, еще раз
Офлайн
А если “в лоб”, что то типа этого:
import Image
old=Image.open('test.jpg')
new=Image.new('RGBA',old.size)
mask=Image.new('1',old.size)
for x in xrange(old.size[0]):
for y in xrange(old.size[1]):
rgb=old.getpixel((x,y))
alfa=1
if rgb==(255,255,255):alfa=0
mask.putpixel((x,y),alfa)
new.paste(old,mask=mask)
new.save('new.png')
Офлайн
ну да, на сегодня я остановился на этом:
xsize, ysize = im.size
back = Image.new('RGBA', (xsize,ysize))
source = im.split()
#R, G, B, A = 0, 1, 2, 3
mask = im.point(lambda i: i == 255 and 255)
source[3].paste(mask)
mask = Image.merge(im.mode, source)
im.paste(back, (0,0), mask=mask)
Отредактировано (Март 29, 2009 22:09:20)
Офлайн
Почему? Исходная картинка без альфа канала, насколько я понимаю. У меня в тестовом коде открывается jpg, который в RGB
Офлайн
да, сорри, это у меня так должно быть… я после открытия сконвертил а RGBA
но предложенный тобой код работает не в пример долго (ничего личного :)), я даже таймер ставить не стал, на глаз видно, учитывая, что надо не только 255 поменять на прозрачность..
с учетом этого, вот 100% рабочий вариант, который я выбрал и достаточно быстрый:
xsize, ysize = im.size
back = Image.new('RGBA', (xsize,ysize), (255,255,255,0))
for r in range(5):
mask = im.point(lambda i: i == 255-r and 255)
source[3].paste(mask)
im.paste(back, (0,0), mask=source[3])
Офлайн
squtterНе спорю, point внутри PIL работает скорее всего на С++..
но предложенный тобой код работает не в пример долго (ничего личного :))
Офлайн
igor.kaistвозможно..
Не спорю, point внутри PIL работает скорее всего на С++..
source[3].paste(mask)
im.paste(back, (0,0), mask=mask)
Отредактировано (Март 30, 2009 11:34:55)
Офлайн