2016-04-04 13 views
1

Ich möchte numpy Arrays in Bilder verwandeln können. Zuerst habe ich gelernt, wie man ein 3D-Array (hight x width x color) in ein Bild umwandelt. Nach einigen Recherchen scheint mir PIL (oder Pillow) der natürlichste Weg dafür zu sein. Dies ist, wie ich es im Moment tun (und es funktioniert gut):Kann eine GIF-Animation nur mit der Pillow-Bibliothek erstellt werden?

from PIL import Image 
import numpy as np 

if __name__ == '__main__': 
    h = 4 
    w = 8 
    arr = np.zeros((h,w,3), dtype=np.uint8) 

    arr[0, 0, :] = [255,255,0] 
    arr[3, 7, :] = [0,255,0] 

    img = Image.fromarray(arr, 'RGB') 
    img.save('viz.png') 

Als nächsten Schritt möchte ich eine Liste von 3D-Array nehmen können (oder ein 4D-Array, wo die Zeit ist die zusätzliche Dimension) und erzeugt die entsprechende Animation. So weit, ich habe nicht gefunden, wie es geht.

Es sieht so aus, als könnte Pillow gif-animation lesen. Mit ImageSequence können wir auf seine Frames zugreifen. Ich kann jedoch nicht herausfinden, wie man eine Sequenz von Bildern in eine Animation einfügen kann.

Ich sah einige Lösungen, die ìmages2gif verwenden, aber ich möchte in einer einzigen Bibliothek bleiben.

ADDED

Die Antworten here meine Frage nicht beantworten. Sie verwenden gifmaker Bibliothek, die ich nicht einmal per Pip installieren kann.

+1

Mögliche Duplikat [Speichern eines animierten GIF in Pillow] (http://stackoverflow.com/questions/24688802/saving-an-animated-gif-in- Kissen) – Reti43

+1

@ Reti43, Nein, ich möchte es in Kissen tun und die Antwort dort 'gifmaker' verwendet. – Roman

+0

Welches ist ein Skript von Pillow, das eine Wrapper-Funktion zum Aufrufen von 'Image.save()' mit einem speziellen Parameter ist. Funktioniert das nicht für dich? – Reti43

Antwort

3

Also der Haupteinwand der Frage war, eine GIF-Animation zu erzeugen, die durch eine Liste von 3D-Arrays (Frames) oder durch eine 4D-Matrix (mit Breite, Höhe, Farbe und Zeit als Dimension) ohne Verwendung von Werkzeugen dargestellt wurde das ist "extern" zu Python.

Es sieht aus wie PIL-Bibliothek kann das nicht tun. Zumindest nicht auf einfache Weise ohne Hacks oder Workarounds. Das Ziel kann jedoch erreicht werden, indem die Bibliothek moviepy verwendet wird. Hier ist die elegante Lösung dieser Bibliothek zur Verfügung gestellt:

import numpy as np 
import moviepy.editor as mpy 

def make_frame(t): 

    h = 100 
    w = 100 

    ar = np.zeros((h, w, 3)) 

    for hi in range(h): 
     for wi in range(w): 
      for ci in range(3): 
       ar[hi, wi, ci] = 255.0*t/15.0 
    return ar 


if __name__ == '__main__': 

    clip = mpy.VideoClip(make_frame, duration=15.0) 
    clip.write_gif('ani.gif', fps=15)