Уведомления

Группа в Telegram: @pythonsu

#1 Март 28, 2009 21:40:38

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

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

Суть.
Есть картинка с белым фоном. На странице рисуется с помощью PIL:

    def __call__(self, id_comp, shop, size=80, filename=''):
imgdata = StringIO.StringIO()
self.request.response.setHeader('Content-Type', 'image/png')
im = Image.open(self.getImagePath(id_comp, shop, filename))
im.thumbnail((size, size), Image.ANTIALIAS)
im.save(imgdata, 'JPEG', quality=70)
return imgdata.getvalue()
Задача заменить все белые пиксели в картинке на прозрачные.
Перерыл весь PIL и интернет, может и глаз уже замылил, но никак не нахожу решения.
Заранее спасибо.



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

Офлайн

#2 Март 29, 2009 11:00:37

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

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

Попробуй воспользоваться поиском по форуму. Я лично отвечал уже на подобный вопрос :)



Офлайн

#3 Март 29, 2009 11:26:03

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

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

igor.kaist
Попробуй воспользоваться поиском по форуму. Я лично отвечал уже на подобный вопрос :)
я написал вроде, что “Перерыл весь PIL и интернет, может и глаз уже замылил, но никак не нахожу решения. ”

и ты уверен, что твой ответ соответствует моему вопросу?!
думаешь, тупо второй день сижу и жду когда мне совет дадут?

взял бы и запостил ссылку, а чего так воздух сотрясать… лучше бы уж и не писал ничего…



Офлайн

#4 Март 29, 2009 12:15:21

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

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

http://python.su/forum/viewtopic.php?id=3596
Вот пример работы с прозрачностью, заодно видно, как работать с цветовыми каналами.

squtter
взял бы и запостил ссылку, а чего так воздух сотрясать… лучше бы уж и не писал ничего…
тебе самому лень набрать в строке поиска “PIL” или подумать? И нечего грубить….



Офлайн

#5 Март 29, 2009 12:36:58

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

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

igor.kaist
тебе самому лень набрать в строке поиска “PIL” или подумать? И нечего грубить….
тебе никто не грубил…
перед тем как постить свой вопрос, я изучил форум на предмет возможного ответа..
а на форум я попал через яндекс, найдя этот твой пост… :)
если бы он мне помог, я бы и не спрашивал…
а если бы ты по существу ответил сразу, не было этого ненужного диалога.. твои посты не лечат, поэтому, чтобы отсылать в поиск, вник бы сначала в вопрос… ;)



Отредактировано (Март 29, 2009 12:37:47)

Офлайн

#6 Март 29, 2009 13:49:53

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

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

igor.kaist
Он прав, я тоже в поиске по форуму ничего полезного в данном вопросе не нашел., хотя все ветки по слову PIL просмотрел внимательно.
squtter
Есть point. Просто нужно будет передать ему функцию, которая заменит цвет пиксела одного цвета на нужный.

Офлайн

#7 Март 29, 2009 14:24:20

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

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

Ferroman
Просто нужно будет передать ему функцию, которая заменит цвет пиксела одного цвета на нужный.
Спасибо, Ferroman.
Будет превосходно, если подскажете, как это сделать…. :rolleyes:



Офлайн

#8 Март 29, 2009 14:30:11

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

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

то есть, например, имеем:

imR, imG, imB, imA = im.split()
imA = imA.point(lambda pixel: 128)
outfile = Image.merge('RGBA', (imR, imG, imB, imA))

при таком раскладе получаем полупрозрачность на всю картинку..
значит, надо выполнять такую функцию, когда и imR, и imG, и imB для конкретной точки равны 255.. правильно?
если да, то как это сделать?



Отредактировано (Март 29, 2009 14:30:37)

Офлайн

#9 Март 29, 2009 17:48:02

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

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

Честно говоря, я PIL не использовал вообще :) Я просто не знаю как они там представляются.
Можно просто

imA = imA.point(lambda x: (x == <значение белого> and x) or <значение прозрачности>)

Офлайн

#10 Март 29, 2009 18:57:58

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

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

да вот, не так все просто получается..
вернее, не получается…

как я понимаю, split раскладывает картинку на каналы RGB и A- альфа…

Ferroman
imA = imA.point(lambda x: (x == <значение белого> and x) or <значение прозрачности>)
я примерно об этом же и сказал, но у вас здесь идет обработка альфа-канала и, соответственно, у него нет значения белого…
думаю, должно быть так:

imA = imA.point(lambda x: (r == 255 and g ==255 and b ==255) and 0)
но вот как получить эти r, g, b для каждой точки внутри labmda?



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

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version