Java: BufferedImage a byte array y viceversa

Veo que varias personas han tenido un problema similar, sin embargo, todavía debo intentar encontrar exactamente lo que estoy buscando.

Entonces, tengo un método que lee una imagen de entrada y la convierte en una matriz de bytes:

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

Lo que ahora quiero hacer es convertirlo de nuevo en una Imagen Buffered (tengo una aplicación para la que necesito esta funcionalidad). Tenga en cuenta que “prueba” es la matriz de bytes.

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

Sin embargo, esto devuelve la siguiente excepción:

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

Esto se debe a que BufferedImage img es nulo. Creo que esto tiene algo que ver con el hecho de que en mi conversión original de BufferedImage a byte array, la información se cambia / pierde para que los datos ya no puedan ser reconocidos como jpg.

¿Alguien tiene alguna sugerencia sobre cómo resolver esto? Sería muy apreciado.

Esto se recomienda para convertir a una matriz de bytes

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

Tenga en cuenta que al llamar close o flush no hará nada, puede ver esto usted mismo mirando su fuente / documento:

Cerrar un ByteArrayOutputStream no tiene ningún efecto.

El método de descarga de OutputStream no hace nada.

Por lo tanto, use algo como esto:

 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(); 

Aquí hay algunos enlaces relacionados con la sugerencia de tamaño:

  • Java: memoria eficiente ByteArrayOutputStream
  • jpg bits por píxel