2009-07-28 18 views
6

Tengo una aplicación C++ que se comunica con una cámara y recupera datos de imágenes sin formato. Luego tengo un Byte [] en C++, que deseo enviar a Java con JNI.Cómo crear un archivo BMP a partir de bytes sin formato [] en Java

Sin embargo, necesito convertir el Byte sin formato [] a un formato de archivo real (.bmp fue mi primera opción). Puedo hacerlo fácilmente si lo escribo desde C++ a un archivo en el disco duro, usando BITMAPFILEINFO y BITMAPHEADERINFO, pero no sé cómo se podría enviar el formato completo a Java.

Luego pensé en enviar solo datos de bytes brutos [] usando JNI y luego convertirlos a .bmp, pero parece que no puedo encontrar ninguna buena biblioteca para hacer esto en Java.

¿Cuál sería mi mejor opción? ¿Convirtiendo la imagen en C++ y luego enviándola usando JNI o ​​enviando los datos RAW a Java y luego convirtiéndolos a .bmp? ¿Cómo sería más fácil lograr esto?

Respuesta

6

Es tan sólo dos líneas en Java 1.5:

BufferedImage image = ImageIO.read(new ByteArrayInputStream(byteArray)); 
ImageIO.write(image, "BMP", new File("filename.bmp")); 

Java (en Windows) sabe cómo exportar jpg, png y bmp Por lo que yo sé.

+1

Esta solución no funciona para mí. la imagen siempre se devuelve como nula. Entonces ImageIO.write lanza una excepción. Mi matriz de bytes es una información de imagen Y en bruto. ¿Puedes elaborar más? –

+0

¿Estás seguro de que tu byteArray es una imagen válida? Creo que la única forma de obtener 'image == null' es si no hay ningún ImageReader registrado que pueda decodificar tu transmisión. Así que supongo que es un tipo de archivo que no es compatible o datos corruptos. – Stroboskop

+0

Es una información de imagen YUV con una relación 4: 0: 0. –

4

No hay necesidad de hacer nada de eso. Convierta la matriz de bytes en un InputStream y alimente eso a ImageIO.read();

public Image getImageFromByteArray(byte[] byteArray){ 
    InputStream is = new ByteArrayInputStream(byteArray); 
    return ImageIO.read(is); 
} 

Esto crea un objeto de imagen de su matriz de bytes, que es entonces muy trivial, de hecho para mostrar el interior de un componente de interfaz gráfica de usuario. Si desea guardarlo, puede usar la clase ImageIO también.

public void saveImage(Image img, String fileFormat, File f){ 
    ImageIO.write(img, fileFormat, f); 
} 
+0

¿Estás seguro de que esto funcionará? ¿Cómo sabrá ImageIO el formato de los píxeles almacenados en la matriz de bytes? –

+1

porque verifica el encabezado del archivo como lo haría cualquier otra herramienta gráfica. – Stroboskop

+0

Si lo que tiene es un búfer RGB puro, es posible que desee consultar la documentación de BufferedImage.setRGB() –

1

Si usted sabe cómo escribir como .bmp a un archivo, a continuación, puede utilizar (casi) el mismo código para escribir en un búfer de memoria en su lugar. Ese búfer de memoria se puede enviar a Java y hacer que decodifique el formato como lo mencionan Stroboskop o Markus Koivisto. Si editó su pregunta para incluir la forma en que escribe los datos en un archivo .bmp, podría sugerir cómo convertir eso en una operación en memoria.

Cuestiones relacionadas