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

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

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


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

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


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);
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.