集中切れたからブログ書く.
これが良い手法かどうかわからないが、numpyからpillowいったり、Python file objectからpillowいったり、pillowからPython file objectへコンバートしてみた。
環境
- Python2.7.11
- numpy==1.13.1
- Pillow==4.2.1
多分だけど、3系もさほど変わらないと思う。
準備
>>> from PIL import Image >>> import numpy as np >>> import io
numpy -> pillow
>>> numpy_object = np.zeros([500, 500]) >>> Image.fromarray(numpy_object) <PIL.Image.Image image mode=F size=500x500 at 0x103762450> >>> Image.fromarray(numpy_object, mode='RGB') # modeで画像のチャネルを指定できる <PIL.Image.Image image mode=RGB size=500x500 at 0x103996B90>
pillow -> numpy
np.asarray()
を使えばおk. 楽.
>>> pillow_object = Image.open('./assets/1.jpg') >>> np.asarray(pillow_object).shape (500, 500, 3)
pillow -> Python file object
要はbytes?
>>> pillow_object = Image.open('assets/1.jpg') >>> buf = io.BytesIO() >>> pillow_object.save(buf, 'jpeg', quality=25, optimize=True) # メモリに書き込み。重い >>> python_file_object = buf.getvalue()
コメントにも書いているけど、これが重い処理。できればこれやめたい。(画像の容量次第だししょうがないのかな。。。)
Python file object -> pillow
>>> f = open('assets/1.jpg') >>> read_data = f.read() >>> Image.open(io.BytesIO(read_data)) <PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=2480x3507 at 0x103DF8710>
これはいい感じで早い。
雑感
pillowにするのは早いけど、pythonのfile objectにするのは遅いのか。。。。?