2009-05-18 12 views
0

Ich bin mit JNI erhalten rohe Bilddaten in folgendem Format zu lesen:Versuch rohe Bilddaten in Java durch JNI

Die Bilddaten werden in dem Format eines DATA32 (32 Bit) pro Pixel zurück in ein lineares Array, das von oben links im Bild nach rechts unten angeordnet ist, wobei jede Zeile von links nach rechts verläuft. Jedes Pixel hat die oberen 8 Bits als Alphakanal und die unteren 8 Bits sind der blaue Kanal - also sind die Bits eines Pixels ARGB (von den meisten bis zu den niedrigstwertigen 8 Bits pro Kanal). Sie müssen die Daten irgendwann zurückgeben.

Das DATA32 Format ist im Wesentlichen ein unsigned int in C

ich ein int [] array So erhalten und dann versuchen, eine gepufferte Bild aus ist es von

 int w = 1920; 
     int h = 1200; 

     BufferedImage b = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB); 


     int[] f = (new Capture()).capture(); 
     for(int i = 0; i < f.length; i++){; 
       b.setRGB(x, y, f[i]); 
     } 

f zu erstellen das Array mit den Pixeldaten.

Nach der Java-Dokumentation dieses seit BufferedImage.TYPE_INT_ARGB arbeiten soll, ist:

Stellt ein Bild mit 8-Bit-RGBA-Farbkomponenten in ganzzahlige Pixel gepackt. Das Bild hat ein DirectColorModel mit Alpha. Die Farbdaten in diesem Bild werden als nicht mit Alpha multipliziert angesehen. Wenn dieser Typ als imageType-Argument für einen BufferedImage-Konstruktor verwendet wird, stimmt das erstellte Bild mit Bildern überein, die in JDK1.1 und früheren Versionen erstellt wurden.

Wenn nicht mit 8-Bit-RGBA, bedeutet dies, dass alle zusammengesetzten Komponenten in 8 Bits codiert sind? Aber das ist unmöglich.

Dieser Code funktioniert, aber das Bild, das erzeugt wird, ist überhaupt nicht wie das Bild, das es erzeugen sollte. Es gibt Tonnen von Artefakten. Kann jemand hier etwas offensichtlich falsch sehen?

Hinweis erhalte ich meine Pixeldaten mit

imlib_context_set_image(im); 
data = imlib_image_get_data(); 

in meinem C-Code, mit der Bibliothek imlib2 mit api http://docs.enlightenment.org/api/imlib2/html/imlib2_8c.html#17817446139a645cc017e9f79124e5a2

Antwort

0

ich bin ein Idiot.

Dies ist lediglich ein Fehler.

Ich habe vergessen zu enthalten, wie ich x, y oben berechnen. Grundsätzlich

I war für loop

int x = i%w; 
int y = i/h; 

in der Verwendung, was falsch ist. Should be

int x = i%w; 
int y = i/w; 

Ich kann nicht glauben, dass ich diesen dummen Fehler gemacht habe.