我有一个标识,我需要制作成单色版本,例如全红色。例如,转换为:
到此:
我在PIL(主要是Image.paste)中尝试了各种技术,但结果并不尊重边缘周围的部分alpha透明像素。
答案 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()
修改:如果您希望保持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])
答案 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')
对于小的示例图像,这种方法非常快,但我不确定它对大文件的作用如何,所以任何替代方案都会受到欢迎!