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);
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);
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.
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);
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);
}
}