Convertir une chaîne de caractères base64 en Image en Java

j'ai une image qui m'est envoyée à travers une chaîne JSON. Je veux convertir cette chaîne en une image dans mon application android, puis afficher l'image.

la chaîne JSON ressemble à ceci:

"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAVI..."

Note: j'ai tronqué la chaîne avec un ...

j'ai une fonction qui (je pense) convertit la chaîne en image. Suis-je à faire de ce droit?

public Bitmap ConvertToImage(String image){
    try{
        InputStream stream = new ByteArrayInputStream(image.getBytes());
        Bitmap bitmap = BitmapFactory.decodeStream(stream);                 
        return bitmap;  
    }
    catch (Exception e) {
        return null;            
    }
}

puis j'essaie de l'afficher sur mon activité android comme ce

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, quand je fais ceci, rien ne se montre. Je n'ai aucune erreur dans le logcat. Ce que je fais mal?

Merci

18
demandé sur user952342 2013-07-06 23:38:39

3 réponses

je suis inquiet que vous ayez besoin de décoder seulement la chaîne base64 pour obtenir les octets de l'image, donc dans votre

"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAVI..."

chaîne de caractères, vous devez obtenir les données après data:image\/png;base64,, ainsi vous obtenez seulement les octets d'image et puis les décoder:

String imageDataBytes = completeImageData.substring(completeImageData.indexOf(",")+1);

InputStream stream = new ByteArrayInputStream(Base64.decode(imageDataBytes.getBytes(), Base64.DEFAULT));

c'est un code donc vous comprenez comment il fonctionne, mais si vous recevez un objet JSON il doit être fait le correct:

  • conversion de la chaîne JSON en objet JSON.
  • Extrait de l' Chaîne de sous data clé.
  • assurez-vous que cela commence par image/png de sorte que vous savez est une image png.
  • assurez-vous que contient base64 chaîne, de sorte que vous savez que les données doivent être décodés.
  • Décoder les données après base64 chaîne pour obtenir l'image.
43
répondu Jorge Fuentes González 2013-07-06 19:53:30
InputStream stream = new ByteArrayInputStream(image.getBytes());

devrait être changée en

InputStream stream = new ByteArrayInputStream(Base64.decode(image.getBytes(), Base64.DEFAULT));

Consulter http://developer.android.com/reference/android/util/Base64.html pour plus de détails sur la façon de faire un décodage Base64.

Disclaimer: Je n'ai pas vérifié la syntaxe, mais c'est comme ça que vous devriez le faire.

3
répondu Wand Maker 2013-07-06 19:42:56

voici le code de travail qui convertit la entrée encodée Base64 et l'écrit sur le disque. J'ai passé un peu de temps pour 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
répondu user2944582 2014-12-03 19:19:27