Come convertire una stringa Base64 in un'immagine Bitmap per mostrarla in ImageView?


187

Ho una stringa Base64 che rappresenta un'immagine BitMap.

Ho bisogno di trasformare di nuovo quella stringa in un'immagine BitMap per usarla su ImageView nella mia app Android

Come farlo?

Questo è il codice che uso per trasformare l'immagine nella stringa 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);

Risposte:


350

Puoi semplicemente ripristinare il tuo codice usando alcuni altri metodi integrati.

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

23
assicurati di non passare i "dati: image / jpg; base64" e passa solo i byte dell'immagine .. Non dimenticare di cambiare la stringa in byte .. photoData = photoData.substring (photoData.indexOf (",") + 1); byte [] decodedString = Base64.decode (photoData.getBytes (), Base64.DEFAULT); Spero che sia d'aiuto per qualcuno.
srinivasan,

byte [] b = Base64.decode (precedentementeEncodedImage.getBytes (), Base64.DEFAULT); bitmap = BitmapFactory.decodeByteArray (b, 0, b.length); bitmap restituisce null nel mio caso.come convertire la stringa di base 64 in bitmap?
Rajesh,

come già risposto Se la stringa codificata di Image è una risposta JSON, utilizzare semplicemente Base64.URL_SAFE anziché Base64.DEAULT
Chinmoy

7
Per rimuovere i dati: image ... sia per png che per jpeg prova questo:String cleanImage = base64Image.replace("data:image/png;base64,", "").replace("data:image/jpeg;base64,","");
Luis Cabrera Benito

Lavoro superbo come il fascino ... +1
Vasudev Vyas,

65

A chiunque sia ancora interessato a questa domanda: Se: 1-decodeByteArray restituisce null 2-Base64.decode genera un'eccezione bad-base64

Ecco la soluzione: -Si dovrebbe considerare che il valore inviato dall'API è Codificato Base64 e dovrebbe essere decodificato per poterlo lanciare su un oggetto Bitmap! -Vai alla tua stringa con codifica Base64, se inizia con

Dati: image / jpg; Base64

Base64.decode non sarà in grado di decodificarlo, quindi deve essere rimosso dalla stringa codificata:

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

Ora l' oggetto pureBase64Encoded è pronto per essere decodificato:

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

Ora basta semplicemente usare la linea qui sotto per trasformarla in un oggetto Bitmap ! :

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

O se stai usando la grande libreria Glide :

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

Questo dovrebbe fare il lavoro! Ha sprecato un giorno su questo e si è arrivati ​​a questa soluzione!

Nota : se si verifica ancora un errore bad-base64, prendere in considerazione altri flag Base64.decode come Base64.URL_SAFE e così via


Ho ricevuto base64 dalla risposta json, ho usato Base.64.URL_SAFE ho ricevuto un errore bad-base64, ho controllato questa discussione e risolto, Thumbs up man ..
livemaker

17

Questo è un thread molto vecchio, ma ho pensato di condividere questa risposta poiché ho impiegato molto del mio tempo di sviluppo per gestire il NULLritorno di BitmapFactory.decodeByteArray()come ha affrontato @Anirudh.

Se la encodedImagestringa è una JSONrisposta, usa semplicemente Base64.URL_SAFEinvece diBase64.DEAULT

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

1
ricevo un errore bad-base64 (IllegalArgumentException) quando utilizzo Base64.URL_SAFE. Ho verificato la stringa base64 usando un tag img HTML. Sto vedendo l'immagine sulla pagina HTML.
mudit,

Ciao @mudit, hai capito come risolvere l'eccezione bad-base64? Se è così, ti dispiace condividere? Sto avendo lo stesso problema. Sono due giorni ormai che finiscono le idee.
ito,

@to assicurati di non passare i "dati: image / jpg; base64" e passa solo i byte dell'immagine .. Non dimenticare di cambiare la stringa in byte .. photoData = photoData.substring (photoData.indexOf (", ") + 1); byte [] decodedString = Base64.decode (photoData.getBytes (), Base64.DEFAULT);
srinivasan,

Anche io ho faticato molto per questa parola "Base64.URL_SAFE" ..... Stavo andando a prendere come json obj ... Grazie mille
Chinmoy,

11

Per controllare online puoi usare

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

Puoi convertire la stringa in immagine in questo modo

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


2
Ho trovato il sito molto utile per capire se c'era un problema con il mio codice o con i dati dell'immagine. Grazie per la condivisione!
Mark O'Sullivan,

2

Ho trovato questa soluzione semplice

Per convertire da bitmap a Base64 utilizzare questo metodo.

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

Per convertire da Base64 a bitmap O ripristinare.

private Bitmap convertBase64ToBitmap(String b64) {
    byte[] imageAsBytes = Base64.decode(b64.getBytes(), Base64.DEFAULT);
    return BitmapFactory.decodeByteArray(imageAsBytes, 0, imageAsBytes.length);
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.