44318


`python`の画像処理系モジュールである`pillow`を使ってイメージから情報を取り出し、一旦`pickle`に保存して、  
再度取り出した後、そのイメージをもとのイメージのように復元したい  
と考えています。保存とロードで同じものを取り出すところまではできたんですが、  
再度そこから元と同じイメージを作り出すのに、`new`メソッドを用いて、  
それに読み込んだ情報を載せたいと思ったのですが、  
`new`で作った`Image`クラスは、`fromarray`がないと言ってきます。  
`asarray`で作った情報を保存しているので、`fromarray`出来るかなと思ったん  
ですが、出来ませんでした。`Image.new()`で作ったオブジェクトは`Image`オブジェクトであり、`Image`オブジェクトはfromarrayメソッドを持っていると[公式](https://pillow.readthedocs.io/en/5.1.x/reference/Image.html)には書いてあるのですが。  
`print(type(tumps))  
<class 'numpy.ndarray'>`

[code]

    re_im.fromarray(tumps)
    
    AttributeError: 'Image' object has no attribute 'fromarray'
    
[/code]

これがサンプルコードです。

[code]

    from PIL import Image
    import numpy as np
    filename = 'any.png'
    import pickle
    im = Image.open(filename)
    data = np.asarray(im.getdata())
    f = open("test_file.dat","wb")
    
    dumps = pickle.dump(data,f)
    
    f = open("test_file.dat","rb")
    tumps = pickle.load(f)
    re_im = Image.new(im.mode, im.size)
    re_im.fromarray(tumps)
    re_im.show()
    
    
    python3.6.3 
    PIL.PILLOW_VERSION
    Out[10]: '5.1.0'
    
[/code]


CC BY-SA 4.0
2018-05-28T01:29:00.817
44312
2018-05-29T05:44:08.320
2018-05-29T05:43:04.983
24284
24284
question
python python3 pillow
PIL(pillow)で新しく作ったイメージだと、一部のメソッドが欠如する原因と、イメージ情報の永続化と復元の方法について


`show()`のように`Image`クラス本体内で定義された関数（=メソッド）は、`re_im.show()`のように呼び出せますが、`fromarray()`のように`Image`クラス本体の外で定義された関数は、`re_im.fromarray()`のように呼び出せません。`Image.open()`と同様に`Image.fromarray()`で呼び出せば、少なくとも`AttributeError`は解消されます。

詳細はソースコードを確認して下さい。

<https://github.com/python-pillow/Pillow/blob/master/src/PIL/Image.py>


CC BY-SA 4.0
2018-05-28T05:00:46.433
44318
2018-05-28T05:13:19.633
2018-05-28T05:13:19.633
21092
21092
44312
answer


(解決しました。）  
永続化と復元の方は、Kohei TAMURAさんが解答いただいた後に追記し、それに対しての自己回答が見つかったのでここに追記します。

`np.asarray(im.getdata())`が絶対必要だとなぜか思ってたんですが、むしろ余計な処理でした。これを消去し、`data =
np.array(im)`オープンしたイメージファイルをそのまま配列に載せるようにすればできました。

[code]

    from PIL import Image
    import numpy as np
    filename = 'any_data.png'
    import pickle
    im = Image.open(filename)
    
    data = np.array(im)
    f = open("test_file.dat","wb")
    
    dumps = pickle.dump(data,f)
    
    f = open("test_file.dat","rb")
    tumps = pickle.load(f)
    
    array = Image.fromarray(tumps)
    
    array.show()
    
[/code]


CC BY-SA 4.0
2018-05-29T05:44:08.320
44356
2018-05-29T05:44:08.320
24284
44312
answer