Comment convertir une chaîne Base64 en image Bitmap pour l'afficher dans un ImageView?

196

J'ai une chaîne Base64 qui représente une image BitMap.

Je dois à nouveau transformer cette chaîne en une image BitMap pour l'utiliser sur un ImageView dans mon application Android

Comment faire?

C'est le code que j'utilise pour transformer l'image en chaîne base64:

//proceso de transformar la imagen BitMap en un String:
//android:src="c:\logo.png"
Resources r = this.getResources();
Bitmap bm = BitmapFactory.decodeResource(r, R.drawable.logo);
ByteArrayOutputStream baos = new ByteArrayOutputStream();  
bm.compress(Bitmap.CompressFormat.PNG, 100, baos); //bm is the bitmap object   
byte[] b = baos.toByteArray();
//String encodedImage = Base64.encode(b, Base64.DEFAULT);
encodedImage = Base64.encodeBytes(b);
NullPointerException
la source

Réponses:

369

Vous pouvez simplement inverser votre code en utilisant d'autres méthodes intégrées.

byte[] decodedString = Base64.decode(encodedImage, Base64.DEFAULT);
Bitmap decodedByte = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length); 
user432209
la source
24
assurez-vous de ne pas transmettre les "data: image / jpg; base64" et de ne transmettre que les octets de l'image .. N'oubliez pas de changer la chaîne en octets .. photoData = photoData.substring (photoData.indexOf (",") + 1); byte [] decodedString = Base64.decode (photoData.getBytes (), Base64.DEFAULT); J'espère que cela aide quelqu'un.
srinivasan
byte [] b = Base64.decode (précédemmentEncodedImage.getBytes (), Base64.DEFAULT); bitmap = BitmapFactory.decodeByteArray (b, 0, b.length); bitmap renvoie null dans mon cas.Comment convertir une chaîne de base 64 en bitmap?
Rajesh
comme déjà répondu Si la chaîne encodedImage est une réponse JSON, utilisez simplement Base64.URL_SAFE au lieu de Base64.DEAULT
Chinmoy
9
Pour supprimer les données: image ... pour png et jpeg essayez ceci:String cleanImage = base64Image.replace("data:image/png;base64,", "").replace("data:image/jpeg;base64,","");
Luis Cabrera Benito
Superb Work Like Charm ... +1
Vasudev Vyas
66

À tous ceux qui sont toujours intéressés par cette question: Si: 1-decodeByteArray renvoie null 2-Base64.decode lève une exception bad-base64

Voici la solution: -Vous devez considérer que la valeur qui vous est envoyée par l'API est encodée en Base64 et doit être décodée en premier afin de la convertir en objet Bitmap! - Jetez un œil à votre chaîne encodée en Base64, si elle commence par

données: image / jpg; base64

Le Base64.decode ne pourra pas le décoder, il doit donc être supprimé de votre chaîne encodée:

final String encodedString = "data:image/jpg;base64, ....";                        
final String pureBase64Encoded = encodedString.substring(encodedString.indexOf(",")  + 1);

Maintenant, l' objet pureBase64Encoded est prêt à être décodé:

final byte[] decodedBytes = Base64.decode(pureBase64Encoded, Base64.DEFAULT);

Maintenant, utilisez simplement la ligne ci-dessous pour transformer cela en un objet Bitmap ! :

Bitmap decodedBitmap = BitmapFactory.decodeByteArray (decodedBytes, 0, decodedBytes.length);

Ou si vous utilisez la grande bibliothèque Glide :

Glide.with(CaptchaFragment.this).load(decodedBytes).crossFade().fitCenter().into(mCatpchaImageView);

Cela devrait faire l'affaire! Il a gaspillé un jour là-dessus et est venu à cette solution!

Remarque : Si vous obtenez toujours une erreur bad-base64, pensez à d'autres indicateurs Base64.decode comme Base64.URL_SAFE et ainsi de suite

MohammadReza
la source
J'ai eu base64 de la réponse json, utilisé Base.64.URL_SAFE obtenu une erreur bad-base64, vérifié ce fil et résolu, Thumbs up man ..
livemaker
17

C'est un fil très ancien mais pensé pour partager cette réponse car il a fallu beaucoup de temps de développement pour gérer le NULLretour de BitmapFactory.decodeByteArray()@Anirudh.

Si la encodedImagechaîne est une JSONréponse, utilisez simplement à la Base64.URL_SAFEplace deBase64.DEAULT

byte[] decodedString = Base64.decode(encodedImage, Base64.URL_SAFE);
Bitmap decodedByte = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length);
tape m'en cinq
la source
1
J'obtiens une erreur bad-base64 (IllegalArgumentException) lors de l'utilisation de Base64.URL_SAFE. J'ai vérifié la chaîne base64 en utilisant une balise HTML img. Je vois l'image sur la page HTML.
mudit
Salut @mudit, avez-vous trouvé comment corriger l'exception bad-base64? Si oui, cela vous dérange-t-il de partager? J'ai le même problème. Cela fait deux jours maintenant et à court d'idées.
ito
@ito assurez-vous de ne pas transmettre les "data: image / jpg; base64" et de ne transmettre que les octets de l'image .. N'oubliez pas de changer la chaîne en bytes .. photoData = photoData.substring (photoData.indexOf (", ") + 1); byte [] decodedString = Base64.decode (photoData.getBytes (), Base64.DEFAULT);
srinivasan
Moi aussi j'ai beaucoup lutté pour ce mot "Base64.URL_SAFE" ..... Je cherchais comme json obj ... Merci beaucoup
Chinmoy
12

Pour vérifier en ligne, vous pouvez utiliser

http://codebeautify.org/base64-to-image-converter

Vous pouvez convertir une chaîne en image de cette façon

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Base64;
import android.widget.ImageView;

import java.io.ByteArrayOutputStream;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ImageView image =(ImageView)findViewById(R.id.image);

        //encode image to base64 string
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.logo);
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
        byte[] imageBytes = baos.toByteArray();
        String imageString = Base64.encodeToString(imageBytes, Base64.DEFAULT);

        //decode base64 string to image
        imageBytes = Base64.decode(imageString, Base64.DEFAULT);
        Bitmap decodedImage = BitmapFactory.decodeByteArray(imageBytes, 0, imageBytes.length);
        image.setImageBitmap(decodedImage);
    }
}

http://www.thecrazyprogrammer.com/2016/10/android-convert-image-base64-string-base64-string-image.html

Aditya Vyas-Lakhan
la source
2
J'ai trouvé le site Web très utile pour déterminer s'il y avait un problème avec mon code ou avec les données d'image. Merci d'avoir partagé!
Mark O'Sullivan
2

J'ai trouvé cette solution simple

Pour convertir du bitmap en Base64, utilisez cette méthode.

private String convertBitmapToBase64(Bitmap bitmap) {
    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOutputStream);
    byte[] byteArray = byteArrayOutputStream .toByteArray();
    return Base64.encodeToString(byteArray, Base64.DEFAULT);
}

Pour convertir de Base64 en bitmap OU revenir en arrière.

private Bitmap convertBase64ToBitmap(String b64) {
    byte[] imageAsBytes = Base64.decode(b64.getBytes(), Base64.DEFAULT);
    return BitmapFactory.decodeByteArray(imageAsBytes, 0, imageAsBytes.length);
}
Abdul Basit Rishi
la source
1

Ceci est un excellent échantillon:

String base64String = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAA...";
String base64Image = base64String.split(",")[1];
byte[] decodedString = Base64.decode(base64Image, Base64.DEFAULT);
Bitmap decodedByte = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length);
imageView.setImageBitmap(decodedByte);

Échantillon trouvé sur: https://freakycoder.com/android-notes-44-how-to-convert-base64-string-to-bitmap-53f98d5e57af

C'est le seul code qui a fonctionné pour moi dans le passé.

Thiago
la source