Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 6, 2013 15:13:08

Suliman
Зарегистрирован: 2013-06-18
Сообщения: 60
Репутация: +  0  -
Профиль   Отправить e-mail  

Сделать черный фон прозрачным

Мне нужно в PNG сделать черный фон прозрачным.
Нашел следующий код:

from PIL import Image
img = Image.open('img.png')
img = img.convert("RGBA")
pixdata = img.load()
for y in xrange(img.size[1]):
    for x in xrange(img.size[0]):
        if pixdata[x, y] == (255, 255, 255, 255):
            pixdata[x, y] = (255, 255, 255, 0)
img.save("img2.png", "PNG")
по идее все правильно и ничего менять не надо, 255 становится нулем, который вроде как означает прозрачный фон. Но у меня скрипт сохраняет результирующий файл опять с черным фоном. Как быть?

Прикреплённый файлы:
attachment KANOPUS_PSS_944_1_5.png (133,1 KБ)

Офлайн

#2 Ноя. 6, 2013 16:31:43

dimy44
От: Евпатория
Зарегистрирован: 2012-04-21
Сообщения: 463
Репутация: +  42  -
Профиль  

Сделать черный фон прозрачным

Вообще-то чёрный цвет никак не (255, 255, 255, …), а (0, 0, 0, …). В идеале. Возьмите за цвет фона например верхний левый пиксель, и сравнивайте с ним

Офлайн

#3 Ноя. 7, 2013 09:54:33

jcrow
От:
Зарегистрирован: 2011-10-31
Сообщения: 22
Репутация: +  0  -
Профиль   Отправить e-mail  

Сделать черный фон прозрачным

“Черноватый” тоже надо заменять прозрачностью.
Попробуйте так:

from PIL import Image
img = Image.open('img.png')
img = img.convert("RGBA")
pixdata = img.load()
for y in xrange(img.size[1]):
    for x in xrange(img.size[0]):
        if pixdata[x, y][0] <= 10 and pixdata[x, y][1] <= 10 and pixdata[x, y][2] <= 10:
            pixdata[x, y] = (0, 0, 0, 0)
img.save("img2.png", "PNG")




Подпись - это небольшая приписка (хи-хи).

Офлайн

#4 Ноя. 7, 2013 14:12:10

dimy44
От: Евпатория
Зарегистрирован: 2012-04-21
Сообщения: 463
Репутация: +  42  -
Профиль  

Сделать черный фон прозрачным

Почему именно 10 ? Так взявши значение “с потолка” увеличиваются шансы задать прзрачные участки и на самом изображении. Нужно заранее смотреть цвет в нескольких заведомо известных точках background'а и исходя из диапазона, фильтровать. Хотя гарантий никаких быть не может, всё зависит от качества (компрессии) png.

Офлайн

#5 Ноя. 7, 2013 14:15:18

jcrow
От:
Зарегистрирован: 2011-10-31
Сообщения: 22
Репутация: +  0  -
Профиль   Отправить e-mail  

Сделать черный фон прозрачным

dimy44
Почему именно 10 ?
Ну, тогда 8.




Подпись - это небольшая приписка (хи-хи).

Офлайн

#6 Ноя. 7, 2013 15:03:54

dimy44
От: Евпатория
Зарегистрирован: 2012-04-21
Сообщения: 463
Репутация: +  42  -
Профиль  

Сделать черный фон прозрачным

Это несерьёзно. Я написал выше, надо смотреть по факту какого цвета фон. Ну допустим для данного изображения прокатит, а у другого будет белый фон? К примеру.

Офлайн

#7 Ноя. 7, 2013 17:15:00

jcrow
От:
Зарегистрирован: 2011-10-31
Сообщения: 22
Репутация: +  0  -
Профиль   Отправить e-mail  

Сделать черный фон прозрачным

dimy44
Это несерьёзно.
Согласен. В общем случае задача сложнее, но в все равно, артефакты компрессии вынуждают под цветом фона подразумевать диапазон уровней, а не 0 или 255.
А для этого конкретного случая, мне кажется, задача решается ключиком imagemagick'а при повороте картинки ;)




Подпись - это небольшая приписка (хи-хи).

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version