2017-04-05 117 views
3

我正在使用Python 3.6和Pillow 4.0.0 我想從一個數組中創建一個PIL圖像,請參閱下面的簡化代碼,並且收到以下錯誤:AttributeError: 'array.array' object has no attribute '__array_interface__'當調用Image.fromarray()函數。Image.fromarray不能與array.array一起使用

爲什麼會發生這種情況? 當PIL文檔說: 從導出陣列接口的對象(使用緩衝區協議)創建圖像內存。 和array.array單證說: Array對象也實現了緩衝界面,並且可用於任何字節狀物體支持...

from PIL import Image 
from array import array 

arr = array('B', [100, 150, 200, 250]) 
im = Image.fromarray(arr) 
im.show() 
+0

如果沒有別的,你可以說'Image.fromarray(np.asarray(arr))'。 –

+0

PIL的fromarray()與支持[Buffer Protocol](https://docs.python.org/3/c-api/buffer.html)的對象一起工作。 'array.array'對象支持這個。數組接口是由'numpy'模塊定義的。 IMO PIL/pillow應該支持這兩種語言,尤其是Python定義和內置的標準語言。 – martineau

回答

0

您必須使用array interfaceusing the buffer protocol),試試這個:

from PIL import Image 
import numpy as np 

w, h = 512, 512 
data = np.zeros((h, w, 4), dtype=np.uint8) 

for i in range(w): 
    for j in range(h): 
     data[i][j] = [100, 150, 200, 250] 

img = Image.fromarray(data, 'RGB') 

img.show() 

您可以閱讀An Introduction to the Python Buffer Protocol

+1

非常感謝。我已經切換到NumPy,並按預期工作。我已經意識到PIL函數無法從存儲array.array的一維數組中知道圖像大小 – masaj

1

的陣列接口是NumPy的概念:ref。換言之,Image.fromarray只能在numpy數組上運行,而不能在標準Python庫array.array上運行。

相關問題