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

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top