io.BytesIOを使用すると普通はファイルに書き出す操作を省き仮想的にメモリ上に書き出すことができる。
matplotlibと合わせた使用法の例を作っていた。
まずio.BytesIOは何かというと,C#でいうMemoryStreamのような扱いができるもの。
扱う内容が文字列に限定される場合にはio.StringIOというものも用意されている。
例えば,item = io.BytesIO()で用意しておいて,plt.savefig(item, format='***')でバイト列に書き出す。
さらに,下の例ではImage.openでまるでファイルのようにitemを引数と渡せるようになる。
from matplotlib import pyplot as plt
import numpy as np
from PIL import Image, ImageDraw
import io
fig = plt.figure()
plt.plot(np.sin(np.linspace(0, 10, num=250)), 'r')
plt.xlim(0, 250)
plt.ylim(-1, 1)
plt.title('Sinusoidal wave')
item = io.BytesIO()
plt.savefig(item, format='png') #ここで書き出し
item.seek(0)
im = Image.open(item)#さらにメモリ上のファイルのように扱う
im = im.resize((200, 200))
item.close()
im.show()
ファイルを開いてファイルに書き出すように設計されているプログラムで応用ができそう。上の例ではいったん書き出してリサイズしてから表示している。
ファイルへの書き出しは,item.read()をファイルに書き出せばよい。
from matplotlib import pyplot as plt
import numpy as np
from PIL import Image, ImageDraw
import io
fig = plt.figure()
plt.plot(np.sin(np.linspace(0, 10, num=250)), 'r')
plt.xlim(0, 250)
plt.ylim(-1, 1)
plt.title('Sinusoidal wave')
item = io.BytesIO()
plt.savefig(item, format='svg') #ここで書き出し
item.seek(0)
with open('test.svg','wb') as out: # Open file as bytes
out.write(item.read())