Форум сайта python.su
0
Мне нужно в 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")
Прикреплённый файлы:
KANOPUS_PSS_944_1_5.png (133,1 KБ)
Офлайн
Вообще-то чёрный цвет никак не (255, 255, 255, …), а (0, 0, 0, …). В идеале. Возьмите за цвет фона например верхний левый пиксель, и сравнивайте с ним
Офлайн
0
“Черноватый” тоже надо заменять прозрачностью.
Попробуйте так:
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")
Офлайн
Почему именно 10 ? Так взявши значение “с потолка” увеличиваются шансы задать прзрачные участки и на самом изображении. Нужно заранее смотреть цвет в нескольких заведомо известных точках background'а и исходя из диапазона, фильтровать. Хотя гарантий никаких быть не может, всё зависит от качества (компрессии) png.
Офлайн
0
dimy44Ну, тогда 8.
Почему именно 10 ?
Офлайн
Это несерьёзно. Я написал выше, надо смотреть по факту какого цвета фон. Ну допустим для данного изображения прокатит, а у другого будет белый фон? К примеру.
Офлайн
0
dimy44Согласен. В общем случае задача сложнее, но в все равно, артефакты компрессии вынуждают под цветом фона подразумевать диапазон уровней, а не 0 или 255.
Это несерьёзно.
Офлайн