2016-09-05 136 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") 

更新

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] [掩码] = [r2,g2,b2,alpha2]​​行 – 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

这也不完全是你想要的,这将取代所有的黑色像素与白色。透明度编码在第四个通道称为阿尔法这对你写代码的方式将访问'数据[:,:3]' – Chachmu

+0

所以然后改变它@Chachmu – khakishoiab

0

您可以检查每个像素上的alpha通道是否设置为小于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

这不是一个理想的解决方案,因为像你说,我可以在我的形象上有透明的部分。 –

相关问题