2010-01-21 17 views
8

Ich lese Binärdaten aus einer Datei, die Intensitätswerte über X- und Y-Koordinaten angibt (kein Open-Source-Bildformat) und möchte sie in ein PNG-Bild (oder ein anderes weit verbreitetes Format) konvertieren. Ich habe die Daten in ein Array geladen (die Array-Modul), wobei jedes Element eine ganze Zahl von 0 bis 255 ist es, dies zu einer PNG speichere ich eine 3-Punkt-Tupel von jedem Elemente schaffen (x) wie folgt:Erstelle ein Graustufenbild

t = (x, x, x) 

fügen sie es über das Array anwenden die Karte mit(), dann speichern sie das Bild mit PutData(). Die Umwandlung in das Array von Tupeln dauert jedoch eine lange Zeit (einige Minuten). Gibt es eine Möglichkeit, den rgb-Wert mit nur einer Ganzzahl (kein Tupel) anzugeben. Ich vermute, eine Alternative wäre NumPy zu verwenden, aber ich weiß nicht, wo ich anfangen soll, so dass jede Hilfe in dieser Hinsicht auch anerkannt werden würde.

Vielen Dank im Voraus für die Hilfe.

Antwort

11

Wenn Sie das neue Bild zu erstellen, geben Sie den Modus L:

im = Image.new('L', size) 
im.putdata([x1, x2, x3, ...]) 

Wo Daten eine Liste von Werten ist nicht Tupel.

+0

Genau das, was ich suchte. Vielen Dank! – Vince

3

Es gibt mehr Möglichkeiten, dies zu tun, aber wenn Sie bereits die Daten im Speicher haben, schauen Sie in Image.frombuffer oder Image.fromstring mit dem 'L'-Modus (für 8-Bit-Graustufen-Daten).

0

Würde im.putpixel (xy, Farbe), was du suchst?

+0

putpixel ist deutlich langsamer als PutData –

+0

Ich bin damit einverstanden. Ich habe putpixel() in einer früheren Version verwendet. Arbeitete aber ist ~ 10x langsamer. (1m30s vs 0m15s für PutData()) – Vince

Verwandte Themen