2017-12-22 15 views
0

Ich muss ein transparentes Bild speichern, das aus einem numply-Array besteht. Ich kann das Bild speichern mit:Speichern von RGBA-Bildern mit PIL.Image.frombuffer()

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

Aber ich muss es transparent sein, so habe ich versucht, es zu retten mit:

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

Dann bekomme ich diesen Fehler:

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 

I habe etwas recherchiert, aber alles sieht sehr kompliziert für die einfache Sache aus, die ich versuche ... Kann mir jemand dabei helfen?

Hier ist mein kompletter Code (ich Python ziemlich neu bin :)):

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') 

Antwort

1

Um ein transparant Bild zu speichern, müssen Sie pro Pixel einen vierten Wert haben, der Alpha-Kanal genannt, die bestimmt die Deckkraft Ihres Pixels. (RGBA steht für Rot, Grün, Blau und Alpha.) Das einzige, was in Ihrem Code geändert werden muss, ist im Wesentlichen, dass der vierte Alpha-Wert Tupel mit 4 Werten statt 3 für ein Pixel verwendet. Wenn der vierte Wert auf 255 gesetzt wird, bedeutet das, dass er vollständig sichtbar ist, 0 würde ihn zu 100% transparent machen. Im folgenden Beispiel setze ich einfach jedes Pixel, das du rot zeichnest, vollständig sichtbar, die anderen sind transparent:

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') 
Verwandte Themen