pillowを使ってpngをjpegに変換しようとしています。いくつかのスクリプトを試しましたが、うまくいきませんでした。この2つは、このような小さなpng画像には効果があるようでした。
最初のコードです。
from PIL import Image
import os, sys
im = Image.open("Ba_b_do8mag_c6_big.png")
bg = Image.new("RGB", im.size, (255,255,255))
bg.paste(im,im)
bg.save("colors.jpg")
セカンドコード
image = Image.open('Ba_b_do8mag_c6_big.png')
bg = Image.new('RGBA',image.size,(255,255,255))
bg.paste(image,(0,0),image)
bg.save("test.jpg", quality=95)
しかし、次のような大きな画像を変換しようとすると
が表示されてしまいます。
Traceback (most recent call last):
File "png_converter.py", line 14, in <module>
bg.paste(image,(0,0),image)
File "/usr/lib/python2.7/dist-packages/PIL/Image.py", line 1328, in paste
self.im.paste(im, box, mask.im) ValueError: bad transparency mask
何が間違っているのでしょうか?
convert()メソッドを使用する必要があります。
from PIL import Image
im = Image.open("Ba_b_do8mag_c6_big.png")
rgb_im = im.convert('RGB')
rgb_im.save('colors.jpg')
詳細はこちら: http://pillow.readthedocs.io/en/latest/reference/Image.html#PIL.Image.Image.convert
この画像の問題点は、サイズが大きいことではなく、RGBではないこと、特にインデックス画像であることです。 .
シェルを使って変換した方法を紹介します。
>>> from PIL import Image
>>> im = Image.open("Ba_b_do8mag_c6_big.png")
>>> im.mode
'P'
>>> im = im.convert('RGB')
>>> im.mode
'RGB'
>>> im.save('im_as_jpg.jpg', quality=95)
そこで、コードに画像のモードをチェックする機能を追加します。
if not im.mode == 'RGB':
im = im.convert('RGB')
開いた画像をRGBに変換すれば、任意の形式で保存することができます。コードになります。
from PIL import Image
im = Image.open("image_path")
im.convert('RGB').save("image_name.jpg","JPEG") #this converts png image as jpeg
画像のサイズをカスタマイズしたい場合は、画像を開くときに次のようにサイズを変更します。
im = Image.open("image_path").resize(x,y)
のようにリサイズしてから、RGBに変換して保存してください。
あなたのコードの問題点は、pngをRGBブロックに貼り付け、ハードコーディングによってjpegとして保存していることです。実際にはpngをjpegに変換していません。