[英]How can I convert an partially alpha transparent image to have single (non-transparent) colour in 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')
對於小的示例圖像,這很快就能很好地工作,但是我不確定它如何適用於較大的文件,所以任何替代方案都會受到歡迎!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.