Найти - Пользователи
Полная версия: Замена белого на прозрачный с помощью PIL
Начало » Python для новичков » Замена белого на прозрачный с помощью PIL
1 2
Ferroman
Есть проще решение, тут надыбал:
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)
Но думаю можно и поинтом.
squtter
да, спасибо, полезная ссылка..
работает, правда качество значительно теряется: из PNG 24 в GIF :)

и, как выясняется, надо не только белый (255,255,255) определить прозрачным, но и ближайшие оттенки…
поэтому, буду пробовать как-то через поинт делать… отпишу по результату, но всегда буду рад помощи…
squtter
поспешил с ответом, по вашей ссылке многое проясняется ))

спасибо, еще раз
igor.kaist
А если “в лоб”, что то типа этого:
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')
это первое, что на ум пришло. И еще штук 5-10 разных вариантов перебрать можно…
squtter
ну да, на сегодня я остановился на этом:
            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)
позже посмотрю, что будет работать быстрее..

спасибо, igor.kaist
…и извини за резкость :)

да! и у тебя в коде должно быть так: if rgb==(255,255,255,255):alfa=0
igor.kaist
Почему? Исходная картинка без альфа канала, насколько я понимаю. У меня в тестовом коде открывается jpg, который в RGB
squtter
да, сорри, это у меня так должно быть… я после открытия сконвертил а 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])
всем спасибо, очень результативно получилось :)
igor.kaist
squtter
но предложенный тобой код работает не в пример долго (ничего личного :))
Не спорю, point внутри PIL работает скорее всего на С++..
squtter
igor.kaist
Не спорю, point внутри PIL работает скорее всего на С++..
возможно..

а код можно упростить, убрав лишнее:
source[3].paste(mask)
должно работать сразу на:
im.paste(back, (0,0), mask=mask)
да и тему можно закрыть, наверное…
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