2009-05-18 9 views
0

J'utilise JNI pour obtenir des données d'images brutes dans le format suivant:Essayer de lire les données d'image brutes en Java via JNI

Les données d'image est retournée dans le format d'un DATA32 (32 bits) par pixel un tableau linéaire ordonné du haut à gauche de l'image vers le bas à droite allant de gauche à droite chaque ligne. Chaque pixel a les 8 bits supérieurs comme canal alpha et les 8 bits inférieurs sont les canaux bleus. Les bits d'un pixel sont donc ARGB (du plus au moins significatif, 8 bits par canal). Vous devez remettre les données à un moment donné.

Le format DATA32 est essentiellement un entier non signé en C.

J'obtenir un tableau int [] et puis essayer de créer une image Buffered sur par

 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 est le tableau avec les données de pixel.

Selon la documentation Java cela devrait fonctionner depuis BufferedImage.TYPE_INT_ARGB est:

représente une image avec des composants de couleurs RGBA 8 bits emballés en pixels entiers. L'image a un DirectColorModel avec alpha. Les données de couleur de cette image sont considérées comme n'étant pas prémultipliées avec alpha. Lorsque ce type est utilisé comme argument imageType pour un constructeur BufferedImage, l'image créée est cohérente avec les images créées dans les versions JDK1.1 et antérieures.

A moins d'un RGBA 8 bits, signifie-t-il que tous les composants ajoutés ensemble sont codés en 8bits? Mais c'est impossible.

Ce code fonctionne, mais l'image produite n'est pas du tout comme l'image qu'il devrait produire. Il y a des tonnes d'artefacts. Quelqu'un peut-il voir quelque chose qui cloche manifestement ici?

Remarque j'obtenir mes données de pixels avec

imlib_context_set_image(im); 
data = imlib_image_get_data(); 

dans mon code C, en utilisant la bibliothèque imlib2 avec api http://docs.enlightenment.org/api/imlib2/html/imlib2_8c.html#17817446139a645cc017e9f79124e5a2

Répondre

0

je suis un idiot.

Ceci est simplement un bug. J'ai oublié d'inclure comment je calcule x, y ci-dessus.

Fondamentalement, j'utilisais

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

dans la boucle, ce qui est faux. DOIT être

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

Je ne peux pas croire que j'ai fait cette erreur stupide.

Questions connexes