如何在PIL中将部分Alpha透明图像转换为单一(非透明)颜色?

时间:2014-01-28 11:54:23

标签: python python-imaging-library image-manipulation

我有一个标识,我需要制作成单色版本,例如全红色。例如,转换为:

enter image description here

到此:

enter image description here

我在PIL(主要是Image.paste)中尝试了各种技术,但结果并不尊重边缘周围的部分alpha透明像素。

3 个答案:

答案 0 :(得分: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')

答案 1 :(得分: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

答案 2 :(得分: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')

对于小的示例图像,这种方法非常快,但我不确定它对大文件的作用如何,所以任何替代方案都会受到欢迎!

相关问题