View Full Version : [Java] ottenere dati BufferedImage
salve a tutti; avendo una BufferedImage creata con la costante TYPE_BYTE_BINARY, quindi un bitmap monocromatico, esiste un modo per ottenere i dati di tale immagine cosi come sono nel formato originale, cioé un array di byte in cui ogni bit é un pixel? sempre che io abbia capito bene com'é il formato TYPE_BYTE_BINARY.
anticipatamente grazie :)
Accedi ai dati nel formato effettivo usando il Raster associato al BufferedImage (metodo getData()). Ha senso usare il raster quando il formato dei pixel usa più di otto bit per canale perchè la resa di getRGB in questo caso sarebbe peggiorativa. Se i pixel usano meno di tale quantità la conversione non comporta perdita di qualità e richiede molte meno invocazioni rispetto al passaggio per il raster.
grazie mille; ma che metodi devo invocare poi sul raster di preciso? io ho chiamato getDataElements(0, 0, null) e ho castato a (byte[]) l'oggetto ritornato; non ottengo eccezioni nel casting peró il formato non é quello che mi aspetto: mi viene ritornato un array di dimensioni larghezza*altezza in cui ciascun byte rappresenta un pixel e assume valore 0x00 o 0x01 (rispettivamente nero e bianco); io invece mi aspettavo di ottenere un array di dimensioni (larghezza*altezza)/8 in cui gli 8 bit di ciascun byte rappresentano 8 pixel diversi: ad esempio un byte contente il valore 0x68, che in binario fa 1101000, dovrebbe contenere tre pixel neri seguiti da uno bianco seguito da un nero e per finire due bianchi. é possibile questa cosa? o per ottenerla devo ricopiare manualmente tutto l'array in uno nuovo fatto da me? il BufferedImage in questione é stato creato manualmente usando TYPE_BYTE_BINARY...
getDataElements restituisce i pixel nel formato di trasferimento. Cioè è già una conversione.
I bit impacchettati che cerchi si trovano nel DataBuffer del Raster:
BufferedImage image = ... BYTE_BINARY
Raster raster = image.getData();
DataBuffer buffer = raster.getDataBuffer();
il metodo getElem restituisce gli elementi del buffer (che è poi un array di array, nel caso di BYTE_BINARY un array di un array perchè questo formato ha un solo banco dati).
grazie mille, sistemato e funzionante! :)
un'ultima cosa, dov'é di preciso nella documentazione che dice che il DataBuffer restituito dal raster restituito da una BufferedImage creata con TYPE_BYTE_BINARY é in realtá un DataBufferByte che contiene un solo banco di dati?
te lo chiedo perché vorrei essere sicuro dell' "ufficialitá" della nozione, e soprattutto della portabilitá (non vorrei che alla prossima versione di Java non mi funziona piu).
Ovviamente da nessuna parte. Se vuoi qualcosa di portabile il getDataBuffer() non lo devi neanche guardare da lontano.
Ciò premesso si spera che per un'immagine dalla scala di grigi in giù di dimensioni umane non usi due bande.
La banda è quella che immagazzina i componenti di un pixel. Il numero di componenti di un pixel dipende dal formato. Un'immagine ARGB ha quattro componenti per pixel. Un'immagine in scala di grigi ha un componente solo.
Si possono anche usare due vettori per conservare quei componenti ma è un tantinello strano. Che fai metti il componente dei pixel pari nella prima banda e quelli dispari nella seconda?
Speriamo di no, ecco :D.
argh ^^'
va bene, grazie di tutto, ho capito :)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.