Java BufferedImage au format PNG Base64 String
Que j'essaie de faire une capture d'écran de sortie comme une chaîne encodée en base64, mais pas très loin. Le code je l'ai utilise un codage Base64 de la bibliothèque ( http://iharder.sourceforge.net/current/java/base64/ ):
Robot robot = new Robot();
Rectangle r = new Rectangle( Toolkit.getDefaultToolkit().getScreenSize() );
BufferedImage bi = robot.createScreenCapture(r);
ByteArrayOutputStream os = new ByteArrayOutputStream();
OutputStream b64 = new Base64.OutputStream(os);
ImageIO.write(bi, "png", os);
ByteArrayOutputStream out = new ByteArrayOutputStream();
out.writeTo(b64);
String result = out.toString("UTF-8");
Chaque fois que je lance ce, "résultat" est toujours une chaîne vide, mais je ne comprends pas pourquoi. Des idées?
Remarque: je ne veux pas avoir à écrire de la png à un fichier sur le disque.
source d'informationauteur user72003
Vous devez vous connecter pour publier un commentaire.
J'ai suivi xehpuk de l' répondre, mais il avait des problèmes avec certaines images ayant les dernières lignes de pixels manquants lors du rendu dans certains navigateurs via un url (Chrome et Firefox, Safari semblait la rendre fine). Je soupçonne que c'est parce que le navigateur est en train de faire c'est mieux pour interpréter les données, mais les derniers octets de données étaient manquantes pour voir ce qu'il peut.
De l'emballage du flux de sortie semble être la cause de ce problème. La documentation pour
Base64.wrap(OutputStream os)
explique:Donc, en fonction de la longueur des données, il est possible depuis quelques octets ne sont pas vidées du stream car
close()
n'est pas appelé. Ma solution à ce n'était pas la peine d'emballage le flux et juste encoder le flux directement:Cela a résolu les problèmes avec le manque de lignes de pixels lors du rendu dans un navigateur.
La déclaration suivante fonctionne dans le mauvais sens:
Il remplace le 64 Base de données avec le vide d'un tableau d'octets de
out
.Quel est le but de
out
de toute façon? Je ne pense pas que vous en avez besoin.Mise à jour:
Et vous écrivez l'image directement à
os
au lieu d'écrire par le biais de la Base 64 codeur.Le code suivant devrait fonctionner:
Base64 d'encodage et de décodage d'images à l'aide de Java 8:
L'utiliser comme ceci pour votre capture d'écran scénario:
Cela fonctionne pour moi:
Coder une Image en Base64 Chaîne
Décodage en Base64 de la Chaîne de l'Image