2009-07-28 18 views
6

J'ai une application C++ qui communique avec une caméra et récupère des données d'image brutes. J'ai alors un Byte [] en C++, que je veux envoyer en Java avec JNI.Comment créer un fichier BMP à partir de raw byte [] en Java

Cependant, j'ai besoin de convertir le Byte brut [] en un format de fichier réel (.bmp était mon premier choix). Je peux facilement le faire si je l'écris de C++ dans un fichier sur le disque dur, en utilisant BITMAPFILEINFO et BITMAPHEADERINFO, mais je ne sais pas comment on pourrait envoyer le format entier à Java. Ensuite, j'ai pensé à envoyer uniquement les données brutes de l'octet [] en utilisant JNI, puis en le convertissant en .bmp, mais je ne trouve aucune bonne bibliothèque pour cela en Java.

Quel serait mon meilleur choix? Convertir l'image en C++ et ensuite l'envoyer en utilisant JNI ou envoyer les données RAW à Java, puis le convertir en .bmp? Comment est-ce que je pourrais le faire plus facilement?

Répondre

6

Il est juste deux lignes en Java 1.5:

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

Java (sous Windows) sait comment exporter jpg, bmp et png pour autant que je sache.

+1

Cette solution ne fonctionne pas pour moi. l'image est toujours renvoyée comme nulle. Donc ImageIO.write génère une exception. Mon tableau d'octets est une donnée d'image Y brute. Pouvez-vous élaborer plus? –

+0

Etes-vous sûr que votre byteArray est une image valide? Je pense que la seule façon d'obtenir 'image == null' est s'il n'y a pas de ImageReader enregistré qui peut décoder votre flux. Donc, je suppose que c'est soit un type de fichier qui n'est pas pris en charge ou des données corrompues. – Stroboskop

+0

Ses données d'image YUV avec rapport 4: 0: 0. –

4

Vous n'avez pas besoin de faire cela. Transformez le tableau d'octets en InputStream et alimentez-le en ImageIO.read(); Cela crée un objet Image à partir de votre tableau d'octets, ce qui est très trivial à afficher à l'intérieur d'un composant GUI. Si vous souhaitez l'enregistrer, vous pouvez également utiliser la classe ImageIO.

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

Etes-vous sûr que cela fonctionnera? Comment ImageIO connaîtra-t-il le format des pixels stockés dans le tableau d'octets? –

+1

car il vérifie l'en-tête du fichier comme n'importe quel autre outil graphique. – Stroboskop

+0

Si vous disposez d'un tampon RVB pur, vous pouvez consulter la documentation de BufferedImage.setRGB() –

1

Si vous savez comment écrire comme .bmp dans un fichier, vous pouvez utiliser (presque) le même code pour l'écriture dans un tampon de mémoire à la place. Ce tampon mémoire que vous pouvez envoyer à Java, et le faire décoder le format comme Stroboskop ou Markus Koivisto mentionné. Si vous avez modifié votre question pour inclure la façon dont vous écrivez les données dans un fichier .bmp, je pourrais suggérer comment convertir cela en une opération en mémoire.