Java: BufferedImage pour octet du tableau et retour

Je vois qu’un certain nombre de personnes ont eu un problème similaire, mais je n’ai pas encore essayé de trouver exactement ce que je cherche.

J’ai donc une méthode qui lit une image d’entrée et la convertit en un tableau d’octets:

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

Ce que je veux maintenant faire, c’est le reconvertir en BufferedImage (j’ai une application pour laquelle j’ai besoin de cette fonctionnalité). Notez que “test” est le tableau d’octets.

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

Cependant, cela renvoie l’exception suivante:

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

C’est parce que l’img BufferedImage est null. Je pense que cela a quelque chose à voir avec le fait que dans ma conversion d’origine de BufferedImage en tableau d’octets, les informations sont modifiées / perdues pour que les données ne puissent plus être reconnues comme un fichier jpg.

Quelqu’un at-il des suggestions sur la façon de résoudre ce problème? Serait grandement apprécié.

Ceci est recommandé pour convertir en un tableau d’octets

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

Notez que l’appel à close ou flush ne fera rien, vous pouvez le voir par vous-même en regardant leur source / doc:

Fermer un ByteArrayOutputStream n’a aucun effet.

La méthode de vidage de OutputStream ne fait rien.

Utilisez donc quelque chose comme ceci:

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

Voici quelques liens concernant l’indice de taille:

  • Java: mémoire efficace ByteArrayOutputStream
  • jpg bits par pixel