[Python]330 pngファイル透過部黒色化への対策

[M1 Mac, Big Sur 11.6.5, Python 3.10.0]

pngファイルをjpgファイルに変換すると透過部が黒色になります。pngファイルの色情報から透明度が削除されたためです。

pngファイル RGBA(0, 0, 0, 0) 透明な黒[見た目は無色透明]

jpgファイル RGB(0, 0, 0) = RGBA(0, 0, 0, 255) 不透明な黒

対策としてpngファイルに再変換された画像の黒っぽい画素についてアルファ値を255から0に置き換えました。自分としては会心の出来ですが、コードにしてみるとあっさりしたものです。ちなみに画像はAdobe Illustratorで作ってみたアプリのアイコンです。フォントは自製しました。無料期間が終わったらどうするか悩みどころです。

jpgの場合は黒を白に変換するなどします。下記コード該当部分をnp.put(pixel,0,255)などに置き換えればできるはずです。

ただ上記の方法では元画像の絵の部分に黒が含まれていればそこも透過してしまいます。その場合は元画像の画素でアルファ値が0のものについて行列インデックスを変数化する、あるいは透過部分を絵にはない色に変換しておく、などの処置が必要です。

numpyと同じことがC++のライブラリでできないか、あるいはC++からnumpyを使えないか調査を進めています。

from PIL import Image
import numpy as np

# pngファイルの色情報を読み込む [red, green, blue, alpha]
img_array = np.array(Image.open('ImageInspector1.png'))

# 黒に近い画素のアルファ値を0にして透過させる
for row in img_array:
    for pixel in row:
        if pixel[0] <= 70 and pixel[1] <= 70 and pixel[2] <= 70 :
            np.put(pixel,3,0)
            
img = Image.fromarray(img_array)

file = "ImageInspector2.png"
img.save(file)
対策前
対策後