web-dev-qa-db-fra.com

Java: BufferedImage vers tableau d'octets 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.

Donc, j'ai 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 une 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!

En effet, l'img BufferedImage est nulle. 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 de sorte que les données ne peuvent plus être reconnues comme jpg.

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

48
user1875290

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

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

Notez qu'appeler close ou flush ne fera rien, vous pouvez le constater par vous-même en consultant leur source/doc:

La fermeture d'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:

7
Christophe Roussy