Cercando di leggere i dati di immagine grezzi in Java tramite JNI
-
22-08-2019 - |
Domanda
sto usando JNI per ottenere dati di immagine grezzi nel seguente formato:
I dati di immagine viene restituita sotto forma di un DATA32 (32 bit) per pixel in una schiera lineare disposto dalla parte superiore sinistra dell'immagine in basso a destra che va da sinistra a destra ogni linea. Ogni pixel ha gli 8 bit superiori come il canale alfa e gli 8 bit inferiori sono il canale blu - così bit di un pixel sono ARGB (dal più al meno significativo, 8 bit per canale). È necessario inserire nuovamente i dati ad un certo punto.
Il formato DATA32 è essenzialmente un int non firmato C.
Così ottengo un array int [] e quindi provare a creare un'immagine tamponata fuori di esso da
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 è la matrice con i dati dei pixel.
In base alla documentazione Java questo dovrebbe funzionare dal BufferedImage.TYPE_INT_ARGB è:
Rappresenta un'immagine con componenti di colore RGBA 8 bit compressi in pixel interi. L'immagine ha una DirectColorModel con alfa. I dati di colore in questa immagine è considerato non essere premoltiplicato con alfa. Quando questo tipo viene usata come argomento imageType ad un costruttore BufferedImage, l'immagine creata è coerente con le immagini create nel JDK1.1 e versioni precedenti.
A meno che da 8-bit RGBA, li vuol dire che tutti i componenti aggiunti insieme sono codificati a 8 bit? Ma questo è impossibile.
Questo codice funziona, ma l'immagine che viene prodotto non è affatto come l'immagine che dovrebbe produrre. Ci sono tonnellate di manufatti. Chiunque può vedere qualcosa di sbagliato, ovviamente, qui dentro?
Nota ottengo i miei dati dei pixel con
imlib_context_set_image(im);
data = imlib_image_get_data();
nel mio codice C, utilizzando l'imlib2 biblioteca con api http: //docs.enlightenment.org/api/imlib2/html/imlib2_8c.html#17817446139a645cc017e9f79124e5a2
Soluzione
Sono un idiota.
Questa è solo un bug.
Ho dimenticato di includere come posso calcolare x, y sopra.
In sostanza stavo usando
int x = i%w;
int y = i/h;
nel ciclo for, che è sbagliato. Deve essere
int x = i%w;
int y = i/w;
Non riesco a credere che ho fatto questo errore stupido.