2013-03-14 10 views
39

Vedo che un numero di persone ha avuto un problema simile, tuttavia devo ancora cercare di trovare esattamente quello che sto cercando.Java: BufferedImage alla matrice di byte e ritorno

Così, ho un metodo che legge un immagine in ingresso e lo converte in un array di byte:

File imgPath = new File(ImageName); 
    BufferedImage bufferedImage = ImageIO.read(imgPath); 
    WritableRaster raster = bufferedImage .getRaster(); 
    DataBufferByte data = (DataBufferByte) raster.getDataBuffer(); 

Quello che ora voglio fare è riconvertirlo in un BufferedImage (Ho una domanda per la quale Ho bisogno di questa funzionalità). Si noti che "test" è l'array di byte.

BufferedImage img = ImageIO.read(new ByteArrayInputStream(test)); 
    File outputfile = new File("src/image.jpg"); 
    ImageIO.write(img,"jpg",outputfile); 

Tuttavia, questo restituisce il seguente eccezione:

Exception in thread "main" java.lang.IllegalArgumentException: im == null! 

Questo perché l'IMG BufferedImage è nullo. Penso che questo abbia qualcosa a che fare con il fatto che nella mia conversione originale da BufferedImage a array di byte, le informazioni sono cambiate/perse in modo che i dati non possano più essere riconosciuti come jpg.

Qualcuno ha qualche suggerimento su come risolvere questo? Sarebbe molto apprezzato

risposta

58

questo si consiglia di convertire in un array di byte

ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
ImageIO.write(img, "jpg", baos); 
byte[] bytes = baos.toByteArray(); 
+3

Flush e vicino farà niente –

+6

C'è un motivo speciale per usare jpg qui? – hguser

+1

E se close() non ha fatto nulla, chiamerebbe flush() stesso, e sarebbe necessario chiamarlo * prima * suByteArray(), non dopo. – EJP

6

Nota che chiamare close o flush non farà nulla, si può vedere questo per te, cercando in loro fonte/doc:

La chiusura di ByteArrayOutputStream non ha alcun effetto.

Il metodo flush di OutputStream non fa nulla.

usare Quindi qualcosa di simile:

ByteArrayOutputStream baos = new ByteArrayOutputStream(THINK_ABOUT_SIZE_HINT); 
boolean foundWriter = ImageIO.write(bufferedImage, "jpg", baos); 
assert foundWriter; // Not sure about this... with jpg it may work but other formats ? 
byte[] bytes = baos.toByteArray(); 

Qui ci sono alcuni link riguardanti il ​​suggerimento dimensioni:

Problemi correlati