Salve a tutti, spero di stare scrivendo nella sezione più adatta del forum.
Necessito di un aiutino, più che altro concettuale, per risolvere una conversione che a prima vista sembrava di facile risoluzione, a seconda vista mi sono perso in un mondo di classi mai viste nè sentite nè tantomeno usate.
Premessa, quasi sicuramente inutile: sto lavorando con NetBeans IDE 7.0.1 + credo con l'ultima versione della jdk.
Problema: ho sotto mano un array di byte consecuitivi che descrivono i pixel di un'immagine. So che questi byte vanno codificati a coppie di due (l'immagine che ne deriva appunto sarà a 16bit) e voglio poterne ricavare il file (png, bmp, tif.. è indifferente) in una QUALSIASI maniera, non necessariamente nella più efficiente. Idee?
Immergendomi nelle API ho vagato di classe in classe e anche su internet ho trovato qualcosa ma niente di specifico. Più o meno la linea guida che ho provato a seguire è la seguente:
Ho creato un array di short ed ci ho mappato i byte a 2 a 2. Con lui ho costruito un DataBufferUShort. Poi ho creato una nuova BufferedImage, un MultiPixelPackedSampleModel (adatto proprio per le immagini a più byte per pixel), un WritableRaster attraverso il metodo createPackedRaster della classe Raster (anch'esso adatto allo scopo, visto che posso specificare i bit dei pixel) e infine settato il raster all'interno della BufferedImage. Il succo del codice è questo:
A prescindere che non sarà sicuramente il modo migliore adatto allo scopo, viene comunque sollevata una java.lang.ArrayIndexOutOfBoundsException all'esecuzione di bimage.setData(raster). Qualche anima buona, nonchè genio, ha un 30 secondi per illuminarmi? Magari suggerendomi una strada alternativa che passa attraverso altre classi. Grazie in anticipo a tutti.codice:short[] shortArray; DataBufferUShort buffer; MultiPixelPackedSampleModel model; WritableRaster raster; shortArray = new short[totBytes / 2]; for (int i = 0; i < shortArray.length; i++) shortArray[i] = (short)(((pixels[2*i+1]&0xFF)<<8) | (pixels[2*i]&0xFF)); buffer = new DataBufferUShort(shortArray, totBytes/2); BufferedImage bimage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); model = new MultiPixelPackedSampleModel(DataBuffer.TYPE_USHORT, width, height, 16); raster = Raster.createPackedRaster(buffer, width, height, 16, null); bimage.setData(raster); try { File outputfile = new File("temp.png"); ImageIO.write(bimage, "png", outputfile); } catch (IOException e) {} // totBytes, width e height sono parametri passati alla funzione, dall'intuitivo significato.

Rispondi quotando