239 votes

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

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

Je dois transformer cette chaîne en une image BitMap pour l'utiliser dans une ImageView de mon application Android.

Comment faire ?

Voici le code que j'utilise pour transformer l'image en String 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);

431voto

user432209 Points 7460

Vous pouvez simplement rétablir 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);

35 votes

Assurez-vous que vous ne passez pas le "data:image/jpg;base64" et passez seulement 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 aidera quelqu'un.

0 votes

Byte[] b = Base64.decode(previouslyEncodedImage.getBytes(), Base64.DEFAULT);bitmap = BitmapFactory.decodeByteArray(b, 0, b.length) ; bitmap retourne null dans mon cas.comment convertir une chaîne de base 64 en bitmap ?

0 votes

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

83voto

EBLiS Points 120

À tous ceux qui sont encore intéressés par cette question : Si : 1-DecodeByteArray renvoie null 2-Base64.decode jette une exception bad-base64

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

données:image/jpg;base64

Base64.decode ne sera pas capable de 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, le purBase64Encoded L'objet est prêt à être décodé :

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

Maintenant, il suffit d'utiliser la ligne ci-dessous pour transformer cela en une Bitmap Objet ! :

Bitmap decodedBitmap = BitmapFactory.decodeByteArray(decodedBytes, 0, longueur des octets décodés) ;

Ou si vous utilisez la grande bibliothèque Glide :

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

Cela devrait faire l'affaire ! J'ai passé une journée sur cette question et j'ai trouvé cette solution !

Note : Si vous obtenez toujours l'erreur bad-base64, considérez d'autres drapeaux Base64.decode comme Base64.URL_SAFE, etc.

18voto

highfive Points 588

Il s'agit d'un très vieux fil de discussion mais j'ai pensé partager cette réponse car elle m'a demandé beaucoup de temps de développement pour la gérer. NULL retour de BitmapFactory.decodeByteArray() comme l'a fait @Anirudh.

Si le encodedImage est une chaîne JSON il suffit d'utiliser Base64.URL_SAFE au lieu de Base64.DEAULT

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

15voto

Aditya Vyas-Lakhan Points 8523

Pour vérifier en ligne, vous pouvez utiliser

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

Vous pouvez convertir une chaîne en image de la manière suivante

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

8voto

Joolah Points 4617

C'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);

Echantillon trouvé chez : 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é.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X