PDA

View Full Version : [Java] Convertire flusso dati grezzo byte[] RGB in BufferedImage


p1111110
24-06-2010, 14:21
Buongiorno,
ho costruito una semplice applicazione che scatta foto da remoto utilizzando una webcam e Java media framework. Discretizzando il flusso del player con frame grabbing Control viene ritornata una immagine di tipo buffer che ho convertito in byte[] e inviato sulla rete al client.

Vorrei sapere se c'è un modo per passare ad una BufferedImage che possa visualizzare in un JPanel. Oltre alla immagine ovviamente spedisco le informazioni sulla dimensione in modo da poterla ricostruire.

banryu79
24-06-2010, 17:10
Dai un'occhiata a javax.imageio.ImageIO : mette a disposizione due metodi 'read' che accettano come parametro un URL o un ImageInputStream e si arrangiano a trovare un ImageReader adatto a leggere l'immagine al dato URL/ImageInputStream e restituirla sottoforma di java.awt.image.BufferedImage.

Se no devi crearti la BufferedImage vuota, conoscendone le dimensioni e il ColorModel adatto, per poi ottenerne il Graphics2D su cui disegnare i singoli pixel...

p1111110
24-06-2010, 21:41
grazie mille per la risposta.
ho risolto guardando il link:
http://stackoverflow.com/questions/1143293/how-to-convert-array-of-bytes-into-image-in-java-se
ovvero:

BufferedImage img=new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
for(int r=0; r<height; r++)
for(int c=0; c<width; c++)
{
int index=r*width+c;
int red=colors[index] & 0xFF;
int green=colors[index+1] & 0xFF;
int blue=colors[index+2] & 0xFF;
int rgb = (red << 16) | (green << 8) | blue;
img.setRGB(c, r, rgb);
}

probabilmente i canali mi arrivano nel formato BGR visto che mi son trovato le foto di colore bluastro (stile avatar) e invertendo i canali ho ritrovato i colori corretti.
L'unico problema è che la foto stampata è sottosopra (invertita verticalmente)...ho invertito i valori dei pixel all'interno dell int[] (dove ogni valore corrisponde ad un int a 32 bit alfa-RGB) costruito ma ora me la ritrovo nel verso giusto ma speculare.
Non ho ben capito a cosa sia dovuto.