2009-03-16 16 views
35

¿Cómo puedo obtener un InputStream desde un objeto BufferedImage? He intentado esto pero ImageIO.createImageInputStream() siempre devuelve NULL¿Cómo obtener un InputStream desde una Imagen Buffered?

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

La miniatura de la imagen está siendo correctamente generada desde que puedo pintar bigImage a un JPanel con éxito.

Gracias.

Respuesta

10

Si usted está tratando de guardar la imagen en un intento archivo:

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

Si lo que desea en los bytes trate de hacer la llamada de escritura, pero pasarle un ByteArrayOutputStream que luego se puede obtener la matriz de bytes a cabo de y haz con ella lo que quieras.

+1

Gracias, escribiendo en ByteArrayOutputStream y luego convirtiéndolo en ByteArrayInputStream hizo el trabajo. Pero me pregunto por qué ImageIO.createImageInputStream() no funcionó. – fromvega

+0

Parece que espera que el objeto pasado sea un archivo (o tal vez otras cosas). No he usado la API antes ... y no estoy seguro de qué es lo que estás tratando de hacer :-) (considera afortunada de mi parte que lo que te di funcionó :-) – TofuBeer

+0

Estoy intentando subir la imagen a un servidor, por eso quiero crear un InputStream a partir de él. – fromvega

72

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

funciona muy bien!

Aquí es cómo se puede hacer un InputStream para 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

funcionó para mí correctlt :) gracias. –

+0

Felipe. Estaba tratando de encontrar el tipo (gif, png, jpg, etc.) de una imagen que proviene de una URL sin extensión. Encontré una solución para ello, pero cuando escribes la imagen en una secuencia de entrada ImageIO.write (image, 'gif', os); ya ha mencionado el tipo de imagen, ¿cómo puedo hacer eso sin especificar el tipo de imagen? – WowBow

+0

Tienes que especificar un tipo. Supongo que no debería ser lo mismo que la entrada. Puede leer desde un PNG y escribir en un JPEG. –

9

reemplazando el método toByteArray(), devolviendo el buf en sí (no copiar), puede evitar los problemas relacionados con la memoria. Esto compartirá la misma matriz, sin crear otra del tamaño correcto. Lo importante es utilizar el método size() para controlar el número de bytes válidos en la matriz.

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

Haciendo esto y usando 'IOUtils.copy (is, output)' el 'buf' da como resultado el doble de tamaño. Entonces parece un enfoque muy malo. Debería declinar, pero ya no puedo más. – Davidea

Cuestiones relacionadas