ITの隊長のブログ

ITの隊長のブログです。Rubyを使って仕事しています。最近も色々やっているお(^ω^ = ^ω^)

Numpy <-> Pillow <-> Python file object

スポンサードリンク

集中切れたからブログ書く.

これが良い手法かどうかわからないが、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にするのは遅いのか。。。。?