2014-01-28 31 views

回答

3
from PIL import Image 

image = Image.open('logo.png') 
assert im.mode.endswith('A'), 'This will only work with images having alpha!' 

image.load() 
alpha = image.split()[-1] 
image2 = Image.new(image.mode, image.size, (255, 0, 0, 0)) 
image2.putalpha(alpha) 

image2.save('logo-red.png') 
+0

谢谢@ mark-ransom。这是一个比遍历所有像素更好的解决方案 – Euan

+0

我已经将代码集成到我正在处理的项目中,它似乎与image.load()省略 - 可以解释这是否会导致任何问题? – Euan

+0

@Euan当我测试它有一个错误:文件“C:\ Python27 \ lib \ site-packages \ PIL \ Image.py”,行1497,在拆分 如果self.im.bands == 1: AttributeError:'NoneType'对象没有属性'bands''。我想这是因为PIL使用延迟加载,'load'强制加载。 –

0

随着matplotlib使用掩码来搜索所有像素不完全透明。 .imread将此加载为RGBA,其中A是alpha通道,使掩码变得简单。从那里简单地使用蒙版将像素更改为所需的颜色。在这种情况下,红色是[1,0,0,1]

import matplotlib.pyplot as plt 
import matplotlib.image as mpimg 

img = mpimg.imread('1EQ07.png') 
opaque_idx = img[:,:,3]>0 
img[opaque_idx] = [1,0,0,1] 
plt.axis('off') 
plt.imshow(img) 
plt.show() 

enter image description here

编辑:如果你想离开Alpha通道不变,您可以创建自定义过滤器,并将其应用在匹配像素。

def custom_filter((r,g,b,a)): 
    return (1,0,0,a) 

img[opaque_idx] = np.apply_along_axis(custom_filter,1,img[opaque_idx]) 

enter image description here

+1

我希望不要引入任何其他依赖关系,并使用原生代码PIL还 – Euan

+0

这个形象很边缘周围的像素化 – Euan

+0

这@Euan像素化是因为输入图像是像素化的,如果你想顺利的抗锯齿版本你总是可以申请一个过滤器后alpha剥离。原始尺寸为 – Hooked

0

经过一番搜索左右,我发现改变的图像数据,逐像素达到的结果,例如

from PIL import Image 

image = Image.open('logo.png') 
assert image.mode == 'RGBA', 'This will only work with RGBA images!' 

width = image.size[0] 
for index, (r, g, b, a) in enumerate(image.getdata()): 
    if a > 0: 
     y, x = divmod(index, width) 
     image.putpixel((x, y), (255, 0, 0, a)) 

image.save('logo-red.png') 

这个工程很快的小例子形象,但我不知道它将如何处理更大的文件工作,所以任何替代将受到欢迎!

+0

使用“加载”功能加快速度。 –