我有一个标志,我需要制作成单色版本,例如全红。例如,转换这样的:如何将PIL中的部分透明图像转换为单一颜色(非透明)?
这样:
我已经试过各种技术PIL(主要是Image.paste),但结果不兑现部分边缘周围的alpha透明像素。
我有一个标志,我需要制作成单色版本,例如全红。例如,转换这样的:如何将PIL中的部分透明图像转换为单一颜色(非透明)?
这样:
我已经试过各种技术PIL(主要是Image.paste),但结果不兑现部分边缘周围的alpha透明像素。
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')
随着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])
经过一番搜索左右,我发现改变的图像数据,逐像素达到的结果,例如
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')
这个工程很快的小例子形象,但我不知道它将如何处理更大的文件工作,所以任何替代将受到欢迎!
使用“加载”功能加快速度。 –
谢谢@ mark-ransom。这是一个比遍历所有像素更好的解决方案 – Euan
我已经将代码集成到我正在处理的项目中,它似乎与image.load()省略 - 可以解释这是否会导致任何问题? – Euan
@Euan当我测试它有一个错误:文件“C:\ Python27 \ lib \ site-packages \ PIL \ Image.py”,行1497,在拆分 如果self.im.bands == 1: AttributeError:'NoneType'对象没有属性'bands''。我想这是因为PIL使用延迟加载,'load'强制加载。 –