どこから見てもメンダコ

軟体動物門頭足綱八腕類メンダコ科

PILでPNG画像をJPEG形式で保存したらなんか黒くなった

やりたいこと

以下のようなpng画像をjpeg形式にして保存しなおす。

f:id:horomary:20181121002359p:plain

エラー内容

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)


f:id:horomary:20181121002604p:plain
原因は白背景に、透過で白に見えている場所(alphaチャンネルで透過)とRGB的に白色の場所が混在していることと思われます。 ロゴやイラストなどではありがちなことでしょう。

解決方法

Stackoverflowで神が解決方法を示してくれていました。

stackoverflow.com

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)


f:id:horomary:20181121004106p:plain

  1. 元画像と同じサイズの真っ白なRGB画像を作成
  2. RGBA画像をRGB+Aに分離
  3. RGB成分を1.で作成した真っ白なRGB画像にペースト

Note: image.load()はimage.split()に必要