Wie konvertiere ich eine Base64-Zeichenfolge in ein Bitmap-Bild, um es in einer ImageView anzuzeigen?

186

Ich habe einen Base64-String, der ein BitMap-Image darstellt.

Ich muss diesen String erneut in ein BitMap-Bild umwandeln, um ihn in einer ImageView in meiner Android-App zu verwenden

Wie es geht?

Dies ist der Code, mit dem ich das Bild in den base64-String umwandle:

//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
quelle

Antworten:

349

Sie können Ihren Code einfach mit anderen integrierten Methoden zurücksetzen.

byte[] decodedString = Base64.decode(encodedImage, Base64.DEFAULT);
Bitmap decodedByte = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length); 
user432209
quelle
22
Stellen Sie sicher, dass Sie nicht die "data: image / jpg; base64" übergeben und nur die Bildbytes übergeben. Vergessen Sie nicht, die Zeichenfolge in Bytes zu ändern. photoData = photoData.substring (photoData.indexOf (",") + 1); byte [] decodedString = Base64.decode (photoData.getBytes (), Base64.DEFAULT); Hoffe es hilft jemandem.
Srinivasan
Byte [] b = Base64.decode (zuvorEncodedImage.getBytes (), Base64.DEFAULT); Bitmap = BitmapFactory.decodeByteArray (b, 0, b.length); bitmap gibt in meinem Fall null zurück. Wie konvertiere ich die 64-Zeichenfolge in eine Bitmap?
Rajesh
wie bereits beantwortet Wenn es sich bei der encodedImage-Zeichenfolge um eine JSON-Antwort handelt, verwenden Sie einfach Base64.URL_SAFE anstelle von Base64.DEAULT
Chinmoy
6
Um die Daten zu entfernen: Bild ... für PNG und JPEG versuchen Sie dies:String cleanImage = base64Image.replace("data:image/png;base64,", "").replace("data:image/jpeg;base64,","");
Luis Cabrera Benito
Hervorragende Arbeit wie Charme ... +1
Vasudev Vyas
65

An alle, die sich noch für diese Frage interessieren: Wenn: 1-decodeByteArray null zurückgibt 2-Base64.decode löst eine bad-base64-Ausnahme aus

Hier ist die Lösung: - Sie sollten berücksichtigen, dass der von der API an Sie gesendete Wert Base64-codiert ist und zuerst dekodiert werden sollte, um ihn in ein Bitmap-Objekt umzuwandeln! - Sehen Sie sich Ihren Base64-codierten String an, wenn er mit beginnt

Daten: image / jpg; base64

Der Base64.decode kann ihn nicht dekodieren. Daher muss er aus Ihrem codierten String entfernt werden:

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

Jetzt kann das pureBase64Encoded- Objekt dekodiert werden:

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

Verwenden Sie jetzt einfach die folgende Zeile, um daraus ein Bitmap- Objekt zu machen! ::

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

Oder wenn Sie die großartige Bibliothek Glide verwenden :

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

Das sollte den Job machen! Es verschwendete einen Tag damit und kam zu dieser Lösung!

Hinweis : Wenn immer noch ein Bad-Base64-Fehler auftritt, sollten Sie andere Base64.decode-Flags wie Base64.URL_SAFE usw. berücksichtigen

MohammadReza
quelle
Ich habe base64 von json response erhalten, Base.64.URL_SAFE verwendet hat einen bad-base64-Fehler erhalten, diesen Thread überprüft und gelöst, Thumbs up man ..
livemaker
17

Dies ist ein sehr alter Thread, aber ich dachte, ich würde diese Antwort teilen, da ich viel Entwicklungszeit gebraucht habe , um die NULLRückkehr von BitmapFactory.decodeByteArray()@Anirudh zu verwalten .

Wenn die encodedImageZeichenfolge eine JSONAntwort ist, verwenden Sie einfach Base64.URL_SAFEanstelle vonBase64.DEAULT

byte[] decodedString = Base64.decode(encodedImage, Base64.URL_SAFE);
Bitmap decodedByte = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length);
Gib mir fünf
quelle
1
Bei Verwendung von Base64.URL_SAFE wird der Fehler bad-base64 (IllegalArgumentException) angezeigt. Ich habe die base64-Zeichenfolge mit einem HTML-img-Tag überprüft. Ich sehe das Bild auf einer HTML-Seite.
Mudit
Hallo @mudit, hast du herausgefunden, wie man die bad-base64-Ausnahme behebt? Wenn ja, haben Sie etwas dagegen zu teilen? Ich habe das gleiche Problem. Ich bin jetzt seit zwei Tagen und habe keine Ideen mehr.
ito
@ito stellen Sie sicher, dass Sie nicht die "data: image / jpg; base64" übergeben und nur die Bildbytes übergeben. Vergessen Sie nicht, die Zeichenfolge in Bytes zu ändern. photoData = photoData.substring (photoData.indexOf (", ") + 1); byte [] decodedString = Base64.decode (photoData.getBytes (), Base64.DEFAULT);
Srinivasan
Auch ich hatte große Probleme mit diesem einen Wort "Base64.URL_SAFE" ..... Ich holte als json obj ... Vielen Dank
Chinmoy
11

Um online zu überprüfen, können Sie verwenden

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

Auf diese Weise können Sie Zeichenfolgen in Bilder konvertieren

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
quelle
2
Ich fand die Website sehr nützlich, um herauszufinden, ob ein Problem mit meinem Code oder den Bilddaten aufgetreten ist. Danke für das Teilen!
Mark O'Sullivan
2

Ich habe diese einfache Lösung gefunden

Verwenden Sie diese Methode, um von Bitmap zu Base64 zu konvertieren.

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

Konvertieren von Base64 in Bitmap ODER Zurücksetzen.

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