やりたいこと
エラー内容
from PIL import Image image = Image.open(PNG_FILE) image.save("out.jpg","JPEG",quality=95)
# 出力 OSError: cannot write mode RGBA as JPEG
PILでpng画像を読み込み、そのままjpegで出力しようとするとRGBA形式はダメだと怒られました。
ならばと思いRGB形式に変換してから保存してみるとなんか黒い部分ができてしまいました。
image = Image.open(path_png) image.convert("RGB") image.save("out.jpg","JPEG",quality=95)
原因は白背景に、透過で白に見えている場所(alphaチャンネルで透過)とRGB的に白色の場所が混在していることと思われます。 ロゴやイラストなどではありがちなことでしょう。
解決方法
Stackoverflowで神が解決方法を示してくれていました。
image=Image.open(image_path) image.load() background = Image.new("RGB", image.size, (255, 255, 255)) background.paste(image, mask=image.split()[3]) background.save("out.jpg","JPEG",quality=95)
- 元画像と同じサイズの真っ白なRGB画像を作成
- RGBA画像をRGB+Aに分離
- RGB成分を1.で作成した真っ白なRGB画像にペースト
Note: image.load()はimage.split()に必要