2012-04-20 17 views
19

Estoy tratando de enviar varias imágenes a través de un socket usando Java pero necesito una forma más rápida de convertir las imágenes a una matriz de bytes para poder enviarlas. Intenté con el siguiente código pero escribí unas 10.000 imágenes en mi unidad C: \. ¿Hay alguna manera de hacer esta conversión sin escribir en el disco? ¡Gracias!Java- Convertir imagen en búfer a byte [] sin escribir en el disco

ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); 

        //ImageIO.setUseCache(false); 
        ImageIO.write(bi.getImage(), "jpg", outputStream); 

        byte[] imageBytes = outputStream.toByteArray(); 
+0

Tenga en cuenta que un poco de tiempo extra haciendo la compresión de imágenes usando una compresión mayor (menor calidad) JPEG puede ahorrar mucho tiempo de la red. Creo que debes considerar el tamaño del byte realmente enviado, que será significativamente más grande con un 'BufferedImage' puro. Por cierto, ¿cuál es la fuente de estas imágenes? Si se trata de capturas de pantalla, por ejemplo, a menudo PNG puede proporcionar un tamaño de byte más pequeño que un JPEG de compresión predeterminado. Si se tratara de capturas de pantalla continuas, tal vez incluso una transmisión de video. –

+0

La fuente son las capturas de pantalla continuas que básicamente estoy convirtiendo en una transmisión. Pero sí, necesito descubrir cómo comprimir las imágenes sin escribirlas en el disco. Ese es mi objetivo final – tier1

Respuesta

38

Esto debería funcionar:

byte[] imageBytes = ((DataBufferByte) bufferedImage.getData().getDataBuffer()).getData(); 
+0

Tu eres un salvavidas. ¡Gracias! – tier1

+14

Esto creará una copia de la imagen. Si solo desea una referencia directa a los bytes, llame a buffer image.getRaster(). GetDataBuffer() y ejecútelo en consecuencia (no siempre es seguro enviar contenido a un DataBufferByte) –

+3

, esto no parece funcionar para mí. Obtengo 'java.awt.image.DataBufferInt no se puede convertir en java.awt.image.DataBufferByte' mi imagen en buffer viene de un' Robot.createScreenCapture() 'no estoy seguro si eso importa – user3712476

-2

Uso Apache Commons IO Utilidades Apache Commons

IOUtils.copy (flujoEntrada, flujoSalida);

IO Utils API soporta las grandes memorias intermedias fácilmente

1

Trate de usar:

ImageIO.setUseCache(false); 

Antes de escribir, tal vez eso ayuda.

+0

Intenté esto, sin embargo, creo que esto todavía se escribe en el disco, simplemente lo borra después de que se completa la operación. – tier1

+0

no debería, al menos de acuerdo con los documentos: 'Establecer este marcador en falso no permite el uso de disco para transmisiones futuras, lo que puede ser ventajoso cuando se trabaja con imágenes pequeñas, ya que se elimina la sobrecarga de crear y destruir archivos. ¿Tal vez su programa escribe en un disco en otro lugar? – soulcheck

+0

Sí, también lo vi en los documentos. De cualquier manera, la operación es dolorosamente lenta para lo que estoy buscando hacer. Gracias sin embargo. – tier1

1
BufferedImage img = ImageIO.read(new ByteArrayInputStream(bytes)); 
byte[] bytes = new byte[buf.capacity()]; 
buf.get(bytes, 0, bytes.length); 
0

El código siguiente es (pocos milisegundos) muy rápido

import com.sun.image.codec.jpeg.JPEGCodec; 
import com.sun.image.codec.jpeg.JPEGImageEncoder; 

public byte[] toByteArray(BufferedImage image) throws IOException { 
    ByteArrayOutputStream baos = new ByteArrayOutputStream();    
    JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(baos); 
    encoder.encode(image);    
    return baos.toByteArray(); 
} 
+3

Es mejor mantenerse alejado con el paquete com.sun. –

Cuestiones relacionadas