簡體   English   中英

如何在PIL中將部分Alpha透明圖像轉換為單一(非透明)顏色?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM