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 でいいよ…