J'ai une image qui m'est envoyée via une chaîne JSON. Je veux convertir cette chaîne en une image dans mon Android puis afficher cette image.
La chaîne JSON ressemble à ceci:
"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAVI..."
Remarque: j'ai tronqué la chaîne avec un ...
J'ai une fonction qui (je pense) convertit la chaîne en une image. Suis-je en train de faire ça?
public Bitmap ConvertToImage(String image){
try{
InputStream stream = new ByteArrayInputStream(image.getBytes());
Bitmap bitmap = BitmapFactory.decodeStream(stream);
return bitmap;
}
catch (Exception e) {
return null;
}
}
Ensuite, j'essaie de l'afficher sur mon Android comme celle-ci
String image = jsonObject.getString("barcode_img");
Bitmap myBitmap = this.ConvertToImage(image);
ImageView cimg = (ImageView)findViewById(R.id.imageView1);
//Now try setting dynamic image
cimg.setImageBitmap(myBitmap);
Cependant, lorsque je fais cela, rien n'apparaît. Je ne reçois aucune erreur dans le logcat. Qu'est-ce que je fais mal?
Merci
Je crains que vous ne deviez décoder que la chaîne base64 pour obtenir les octets d'image, donc dans votre
"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAVI..."
chaîne, vous devez obtenir les données après data:image\/png;base64,
, vous obtenez donc uniquement les octets d'image, puis vous les décodez:
String imageDataBytes = completeImageData.substring(completeImageData.indexOf(",")+1);
InputStream stream = new ByteArrayInputStream(Base64.decode(imageDataBytes.getBytes(), Base64.DEFAULT));
Ceci est un code pour que vous compreniez comment cela fonctionne, mais si vous recevez un objet JSON, il doit être fait de la manière correcte:
data
.image/png
vous savez donc que c'est une image png.base64
chaîne, vous savez donc que les données doivent être décodées.base64
chaîne pour obtenir l'image.InputStream stream = new ByteArrayInputStream(image.getBytes());
devrait être changé en
InputStream stream = new ByteArrayInputStream(Base64.decode(image.getBytes(), Base64.DEFAULT));
Reportez-vous http://developer.Android.com/reference/Android/util/Base64.html pour plus de détails sur la façon de faire le décodage Base64.
Avertissement: je n'ai pas vérifié la syntaxe, mais voici comment vous devez le faire.
Voici le code de travail qui convertit le InputStream encodé en Base64 et l'écrit sur le disque. J'ai passé quelques temps à le faire fonctionner correctement. J'espère donc que cela aidera d'autres développeurs.
public boolean writeImageToDisk(FileItem item, File imageFile) {
// clear error message
errorMessage = null;
FileOutputStream out = null;
boolean ret = false;
try {
// write thumbnail to output folder
out = createOutputStream(imageFile);
// Copy input stream to output stream
byte[] headerBytes = new byte[22];
InputStream imageStream = item.getInputStream();
imageStream.read(headerBytes);
String header = new String(headerBytes);
// System.out.println(header);
byte[] b = new byte[4 * 1024];
byte[] decoded;
int read = 0;
while ((read = imageStream.read(b)) != -1) {
// System.out.println();
if (Base64.isArrayByteBase64(b)) {
decoded = Base64.decodeBase64(b);
out.write(decoded);
}
}
ret = true;
} catch (IOException e) {
StringWriter sw = new StringWriter();
e.printStackTrace(new PrintWriter(sw));
errorMessage = "error: " + sw;
} finally {
if (out != null) {
try {
out.close();
} catch (Exception e) {
StringWriter sw = new StringWriter();
e.printStackTrace(new PrintWriter(sw));
System.out.println("Cannot close outputStream after writing file to disk!" + sw.toString());
}
}
}
return ret;
}
/**
* Helper method for the creation of a file output stream.
*
* @param imageFolder
* : folder where images are to be saved.
* @param id
* : id of spcefic image file.
* @return FileOutputStream object prepared to store images.
* @throws FileNotFoundException
*/
protected FileOutputStream createOutputStream(File imageFile) throws FileNotFoundException {
imageFile.getParentFile().mkdirs();
return new FileOutputStream(imageFile);
}