2017-12-22 13 views
0

numpyの配列から作られた透明な画像を保存する必要があります。私は、画像を保存することができます:PIL.Image.frombuffer()でRGBA画像を保存する

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

しかし、私はそう私がそれを保存しようとした、それは透明である必要は:

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

その後、私はこのエラーを取得する:

File "/home/pi/Documents/Projet/GetPos.py", line 51, in click 
img = Image.fromarray(data, 'RGBA') 
File "/usr/lib/python2.7/dist-packages/PIL/Image.py", line 2217, in 
fromarray 
return frombuffer(mode, size, obj, "raw", rawmode, 0, 1) 
File "/usr/lib/python2.7/dist-packages/PIL/Image.py", line 2162, in 
frombuffer 
core.map_buffer(data, size, decoder_name, None, 0, args) 
ValueError: buffer is not large enough 

私はいくつかの研究を行いましたが、私は何をしようとしているのか非常に複雑に見えます... 誰もがこの1つ私を助けることができますか?ここで

は私の完全なコード(私は:)のpythonにはかなり新しいです)です:

mouse = pymouse.PyMouse() 
posX, posY = mouse.position() 
print(mouse.position()) 

w, h = 1920, 1080 
data = np.zeros((h, w, 3), dtype=np.uint8) 

for x in range(posX-20, posX+20): 
    if x > 1679: 
     data[posY, w-1] = [255, 0, 0] 
    else: 
     data[posY, x] = [255, 0, 0] 

for y in range(posY-20, posY+20): 
    if y > 1049: 
     data[h-1, posX] = [255, 0, 0] 
    else: 
     data[y, posX] = [255, 0, 0] 

img = Image.fromarray(data, 'RGBA')    
##img = Image.frombuffer('RGBA', [1080, 1920], data, "raw", 'RGBA', 0, 1) 
img.save('my.png') 

答えて

1

がtransparant画像を保存するためには、アルファチャネルと呼ばれるピクセルあたり4番目の値を持っている必要があり、そのピクセルの不透明度を決定します。 (RGBAは赤、緑、青、アルファの略です)コード内で変更する必要があるのは、ピクセルに対して3の代わりに4つの値のタプルを使用して4番目のアルファ値を与えることです。 4番目の値を255に設定すると完全に表示され、0の場合は100%透明になります。次の例では、赤を描画していたすべてのピクセルを完全に表示し、他は透明に設定します。

mouse = pymouse.PyMouse() 
posX, posY = mouse.position() 

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

for x in range(posX-20, posX+20): 
if x > 1679: 
    data[posY, w-1] = [255, 0, 0, 255] 
else: 
    data[posY, x] = [255, 0, 0, 255] 

for y in range(posY-20, posY+20): 
    if y > 1049: 
     data[h-1, posX] = [255, 0, 0, 255] 
    else: 
     data[y, posX] = [255, 0, 0, 255] 

img = Image.fromarray(data, 'RGBA')    
img.save('my.png')