web-dev-qa-db-fra.com

Convertir la chaîne base64 en image en Java

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

18
user952342

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:

  • Conversion de la chaîne JSON en objet JSON.
  • Extrayez la chaîne sous la touche data.
  • Assurez-vous que cela commence par image/png vous savez donc que c'est une image png.
  • Assurez-vous qu'il contient base64 chaîne, vous savez donc que les données doivent être décodées.
  • Décodez les données après base64 chaîne pour obtenir l'image.
45
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.

3
Wand Maker

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);
}
1
user2944582