2016-09-05 5 views
2

У меня есть изображение png с прозрачным фоном, и я хочу изменить его на другое изображение, но на белом фоне вместо прозрачного. Как я могу это сделать с помощью PIL?Python PIL: Как установить фон изображения (png) на белый?

Вот мой код:

basewidth = 200 
img = Image.open("old.png") 
wpercent = (basewidth/float(img.size[0])) 
hsize = int((float(img.size[1]) * float(wpercent))) 
img = img.resize((basewidth, hsize), PIL.Image.ANTIALIAS)hsize = int((float(img.size[1]) * float(wpercent))) 
img.save("new.png") 

Update

import numpy as np 
import PIL 
from PIL import Image 


basewidth = 200 
img = Image.open("old.png") 
wpercent = (basewidth/float(img.size[0])) 
hsize = int((float(img.size[1]) * float(wpercent))) 
data = np.array(img) 

alpha1 = 0 # Original value 
r2, g2, b2, alpha2 = 255, 255, 255,255 # Value that we want to replace it with 

red, green, blue,alpha = data[:,:,0], data[:,:,1], data[:,:,2], data[:,:,3] 
mask = (alpha==alpha1) 
data[:,:,:4][mask] = [r2, g2, b2, alpha2] 


img = Image.fromarray(data) 
img = img.resize((basewidth,hsize), PIL.Image.ANTIALIAS) 
img.save('new.png') 

Вот код, предоставляемый @khakishoiab и @Chachmu Спасибо, ребята!

+0

Мы сделали правку, пойти проверить его – khakishoiab

+0

@Banuta Алиня Александр первой догадка будет пытаться заменить данные [:,:,:, 3] с данными [:,:,:, 4] в данных [:,:,:, 3] [mask] = [r2, g2, b2, alpha2] ​​line – Chachmu

+0

Спасибо, теперь он работает как шарм! –

ответ

1
import Image 
from resizeimage import resizeimage 

f = Image.open('old.png') 
alpha1 = 0 # Original value 
r2, g2, b2, alpha2 = 255, 255, 255,255 # Value that we want to replace it with 

red, green, blue,alpha = data[:,:,0], data[:,:,1], data[:,:,2], data[:,:,3] 
mask = (alpha==alpha1) 
data[:,:,:3][mask] = [r2, g2, b2, alpha2] 

data = np.array(f) 
f = Image.fromarray(data) 
f = f.resize((basewidth,hsize), PIL.Image.ANTIALIAS) 

f.save('modified.png', image.format) 
+0

Я думаю, что он изменит размер и изменит цвет также – khakishoiab

+0

Это также не делает то, что вы хотите, это заменяет все черные пиксели белым. Прозрачность кодируется в четвертом канале, называемом альфа, который для того, как вы написали свой код, будет доступен с помощью 'data [:,:, 3]' – Chachmu

+0

, а затем измените его @Chachmu – khakishoiab

0

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

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

... 
pixels = img.load() 

for y in xrange(img.size[1]): 
    for x in xrange(img.size[0]): 
     if pixels[x,y][3] < 255: # check alpha 
      pixels[x,y] = (255, 255, 255, 255) 
img.save("new.png") 
+0

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

 Смежные вопросы

  • Нет связанных вопросов^_^