2009-03-16 9 views
35

Come posso ottenere un InputStream da un oggetto BufferedImage? Ho provato questo ma ImageIO.createImageInputStream() restituisce sempre nullCome ottenere un InputStream da una BufferedImage?

BufferedImage bigImage = GraphicsUtilities.createThumbnail(ImageIO.read(file), 300); 
ImageInputStream bigInputStream = ImageIO.createImageInputStream(bigImage); 

La miniatura immagine viene correttamente generata dal posso dipingere bigImage ad un JPanel con successo.

Grazie.

risposta

10

Se si sta tentando di salvare l'immagine in un file di prova:

ImageIO.write(thumb, "jpeg", new File(....)); 

Se si desidera solo i byte prova a fare la chiamata di scrittura, ma passare un ByteArrayOutputStream quale si può quindi ottenere la matrice di byte fuori e fare con esso quello che vuoi.

+1

Grazie, scrivere su ByteArrayOutputStream e quindi convertirlo in un ByteArrayInputStream ha svolto il lavoro. Ma mi chiedo perché ImageIO.createImageInputStream() non abbia funzionato. – fromvega

+0

Sembra che si aspetti che l'Oggetto passato sia un File (o forse altre cose). Non ho mai usato l'API prima ... e non sono sicuro di cosa stia provando a fare :-) (considera un'ipotesi fortunata da parte mia che quello che ti ho dato ha funzionato :-) – TofuBeer

+0

Sto provando a caricare l'immagine su un server, ecco perché voglio creare un InputStream da esso. – fromvega

72

Da http://usna86-techbits.blogspot.com/2010/01/inputstream-from-url-bufferedimage.html

funziona molto bene!

Ecco come si può fare una InputStream per un BufferedImage:

URL url = new URL("http://www.google.com/intl/en_ALL/images/logo.gif"); 
BufferedImage image = ImageIO.read(url); 
ByteArrayOutputStream os = new ByteArrayOutputStream(); 
ImageIO.write(image, "gif", os); 
InputStream is = new ByteArrayInputStream(os.toByteArray()); 
+2

ha funzionato per me correttamente :) Grazie. –

+0

Felipe. Stavo cercando di trovare il tipo (gif, png, jpg, ecc.) Di un'immagine proveniente da un URL senza un'estensione. Ho trovato un rimedio per questo, ma quando scrivi l'immagine su un flusso di input ImageIO.write (image, 'gif', os); hai già menzionato il tipo di immagine, come posso farlo senza specificare il tipo di immagine. – WowBow

+0

Devi specificare un tipo. Immagino che non sia lo stesso dell'input. Puoi leggere da un PNG e scrivere su un JPEG. –

9

Con l'override del metodo toByteArray(), restituendo il buf stessa (non copiare), è possibile evitare problemi legati memoria. Questo condividerà lo stesso array, non creando un altro della dimensione corretta. L'importante è utilizzare il metodo size() per controllare il numero di byte validi nell'array.

final ByteArrayOutputStream output = new ByteArrayOutputStream() { 
    @Override 
    public synchronized byte[] toByteArray() { 
     return this.buf; 
    } 
}; 
ImageIO.write(image, "png", output); 
return new ByteArrayInputStream(output.toByteArray(), 0, output.size()); 
+0

Facendo questo e usando 'IOUtils.copy (is, output)' il risultato 'buf' ha una dimensione doppia. Quindi sembra un approccio pessimo. Dovrei votare meno, ma non posso più. – Davidea