web-dev-qa-db-fra.com

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

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

J'ai besoin de transformer cette chaîne en une image BitMap à nouveau pour l'utiliser sur un ImageView dans mon application Android

Comment faire?

C’est le code que j’utilise pour transformer l’image en 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);
158

En gros, 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); 
315
user432209

Pour 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 codée en Base64 et doit être décodée en premier pour pouvoir être convertie en objet Bitmap! -Jeter un coup d'oeil à 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 ceci 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 le travail! Un jour, cela a été une perte de temps et je suis arrivé à cette solution!

Note: Si vous rencontrez toujours l'erreur Bad Base64, considérez les autres drapeaux Base64.decode comme Base64.URL_SAFE, etc.

59
MohammadReza

C'est un très vieux fil, mais j'ai pensé partager cette réponse, car il m'a fallu beaucoup de temps de développement pour gérer NULL le retour de BitmapFactory.decodeByteArray() comme l'a fait @Anirudh.

Si la chaîne encodedImage est une réponse JSON, utilisez simplement Base64.URL_SAFE au lieu de Base64.DEAULT

byte[] decodedString = Base64.decode(encodedImage, Base64.URL_SAFE);
Bitmap decodedByte = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length);
14
highfive

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

8
Aditya Vyas-Lakhan