#はじめに
pythonでjpgをpngに変換しても透明度がいじれなかったので,力業で解決した話
#環境
- Windows 10
- VSCode
- Python 3.7.3
#単純に変換してみる
「python convert jpg to png」とかでググるとPillowが出てくると思います.
公式を見ながら下記のようにインストール
pip install Pillow
ここを参考にサンプルを書くと
jpgToPNG.py
from PIL import Image
#絶対パスも可
img = Image.open('input.jpg')
img.save('output.png')
これで一応PNGができるが,透明度をいじるソースを書くとエラーをはく
ちなみに,ペイントを使って変換した画像はきちんと透明度をいじれる
#問題点
しばらく,うんうんうなりながらググっていたら
上記のサイトがヒット
なるほど,pngをjpgに変換してもRGBAのAが残る場合がある(解釈あってる?)ということなら,逆の場合もあるのかもしれない
というわけで,上記のサイトを参考にチェックするソースを作成
checkPNG.py
from PIL import Image
path_png1 = "output1.png" #透明度編集できないPNG
path_png2 = "output2.png" #ペイントで変換した,透明度編集できるPNG
image = np.asarray(Image.open(path_png1))
print(Image.open(path_png1))
print(image.shape)
image = np.asarray(Image.open(path_png2))
print(Image.open(path_png2))
print(image.shape)
結果
<PIL.PngImagePlugin.PngImageFile image mode=RGB size=1920x1080 at 0x1762DB300B8>
(1080, 1920, 3)
<PIL.PngImagePlugin.PngImageFile image mode=RGBA size=1920x1080 at 0x176252F92B0>
(1080, 1920, 4)
たしかに,編集できないPNGはRGB modeになってる.
#解決
原因が分かったので,解決していきます.
png画像とjpg画像の取り扱いの注意点によるとopen()のあとにconvert()を付けるとmodeを変更できるようです.
なので,以下のように実装
jpgToPNG.py
from PIL import Image
rgba_img = Image.open('input.jpg').convert('RGBA')
rgba_img.save('output.png')
print(rgba_img)
print(np.asarray(rgba_img).shape)
結果
<PIL.Image.Image image mode=RGBA size=1920x1080 at 0x1CF941EF9E8>
(1080, 1920, 4)
結果も問題ありませんし,無事透明度をいじることが出来ました.
以上です.