web-dev-qa-db-fra.com

Comment obtenir un InputStream à partir d'une BufferedImage?

Comment puis-je obtenir un InputStream à partir d'un objet BufferedImage? J'ai essayé mais ImageIO.createImageInputStream () renvoie toujours NULL

BufferedImage bigImage = GraphicsUtilities.createThumbnail(ImageIO.read(file), 300);
ImageInputStream bigInputStream = ImageIO.createImageInputStream(bigImage);

La miniature de l'image est correctement générée car je peux peindre bigImage en JPanel avec succès.

Je vous remercie.

42
fromvega

Si vous essayez d'enregistrer l'image dans un fichier, essayez:

ImageIO.write(thumb, "jpeg", new File(....));

Si vous voulez juste au niveau des octets, essayez de faire l'appel d'écriture mais passez-lui un ByteArrayOutputStream dont vous pouvez alors extraire le tableau d'octets et en faire ce que vous voulez.

10
TofuBeer

De http://usna86-techbits.blogspot.com/2010/01/inputstream-from-url-bufferedimage.html

Cela fonctionne très bien!

Voici comment créer un InputStream pour une BufferedImage:

URL url = new URL("http://www.google.com/intl/en_ALL/images/logo.gif");
BufferedImage image = ImageIO.read(url);
ByteArrayOutputStream os = new ByteArrayOutputStream();
ImageIO.write(image, "gif", os);
InputStream is = new ByteArrayInputStream(os.toByteArray());
82
Felipe

En redéfinissant la méthode toByteArray(), en renvoyant le buf lui-même (sans copier), vous pouvez éviter les problèmes liés à la mémoire. Cela partagera le même tableau, sans en créer un autre de la bonne taille. L'important est d'utiliser la méthode size() afin de contrôler le nombre d'octets valides dans le tableau.

final ByteArrayOutputStream output = new ByteArrayOutputStream() {
    @Override
    public synchronized byte[] toByteArray() {
        return this.buf;
    }
};
ImageIO.write(image, "png", output);
return new ByteArrayInputStream(output.toByteArray(), 0, output.size());
9
Igor