Уведомления

Группа в Telegram: @pythonsu

#1 Март 29, 2009 19:30:56

Ferroman
От:
Зарегистрирован: 2006-11-16
Сообщения: 2759
Репутация: +  1  -
Профиль   Отправить e-mail  

Замена белого на прозрачный с помощью PIL

Есть проще решение, тут надыбал:

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)
Но думаю можно и поинтом.

Офлайн

#2 Март 29, 2009 20:17:40

squtter
От:
Зарегистрирован: 2009-03-28
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Замена белого на прозрачный с помощью PIL

да, спасибо, полезная ссылка..
работает, правда качество значительно теряется: из PNG 24 в GIF :)

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



Офлайн

#3 Март 29, 2009 20:30:31

squtter
От:
Зарегистрирован: 2009-03-28
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Замена белого на прозрачный с помощью PIL

поспешил с ответом, по вашей ссылке многое проясняется ))

спасибо, еще раз



Офлайн

#4 Март 29, 2009 21:20:40

igor.kaist
От:
Зарегистрирован: 2007-11-12
Сообщения: 1879
Репутация: +  3  -
Профиль   Отправить e-mail  

Замена белого на прозрачный с помощью PIL

А если “в лоб”, что то типа этого:

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 разных вариантов перебрать можно…



Офлайн

#5 Март 29, 2009 22:00:35

squtter
От:
Зарегистрирован: 2009-03-28
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Замена белого на прозрачный с помощью PIL

ну да, на сегодня я остановился на этом:

            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



Отредактировано (Март 29, 2009 22:09:20)

Офлайн

#6 Март 30, 2009 08:27:30

igor.kaist
От:
Зарегистрирован: 2007-11-12
Сообщения: 1879
Репутация: +  3  -
Профиль   Отправить e-mail  

Замена белого на прозрачный с помощью PIL

Почему? Исходная картинка без альфа канала, насколько я понимаю. У меня в тестовом коде открывается jpg, который в RGB



Офлайн

#7 Март 30, 2009 08:47:50

squtter
От:
Зарегистрирован: 2009-03-28
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Замена белого на прозрачный с помощью PIL

да, сорри, это у меня так должно быть… я после открытия сконвертил а 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])
всем спасибо, очень результативно получилось :)



Офлайн

#8 Март 30, 2009 09:35:03

igor.kaist
От:
Зарегистрирован: 2007-11-12
Сообщения: 1879
Репутация: +  3  -
Профиль   Отправить e-mail  

Замена белого на прозрачный с помощью PIL

squtter
но предложенный тобой код работает не в пример долго (ничего личного :))
Не спорю, point внутри PIL работает скорее всего на С++..



Офлайн

#9 Март 30, 2009 11:34:17

squtter
От:
Зарегистрирован: 2009-03-28
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Замена белого на прозрачный с помощью PIL

igor.kaist
Не спорю, point внутри PIL работает скорее всего на С++..
возможно..

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



Отредактировано (Март 30, 2009 11:34:55)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version