カテゴリー
Uncategorized

pickling a PIL’s Image object

未だに classic class なライブラリは多い。Python 3 への道は遠い…

# register a pickle handler for Image.Image object
import Image, copy_reg
def Image_unpickler(mode, size, data):
return Image.fromstring(mode, size, data).im
def Image_pickler(im):
"""see Image.Image.tostring()"""
e = Image._getencoder(im.mode, 'raw', im.mode)
e.setimage(im)
bufsize = max(65536, im.size[0] * 4) # see RawEncode.c
data = []
while 1:
l, s, d = e.encode(bufsize)
data.append(d)
if s:
break
if s < 0:
raise RuntimeError("encoder error %d in tostring" % s)
data = ''.join(data)
return Image_unpickler, (im.mode, im.size, data, )
ImagingCore = type(Image.core.new('1', (1, 1)))
copy_reg.pickle(ImagingCore, Image_pickler, Image_unpickler)

速度が期待できないディスクとかネットワークとかだと展開速度 > IO の速度になる事も多いので圧縮かますのもあり。

メモリ経由でもどれだけコピーされるか分かったもんじゃないのでもう全部 jpeg でいいよ…

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です