Bagaimana cara mengubah string Base64 menjadi gambar Bitmap untuk ditampilkan di ImageView?

187

Saya memiliki String Base64 yang mewakili gambar BitMap.

Saya perlu mengubah String itu menjadi gambar BitMap lagi untuk menggunakannya pada ImageView di aplikasi Android saya

Bagaimana cara melakukannya?

Ini adalah kode yang saya gunakan untuk mengubah gambar menjadi 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);
NullPointerException
sumber

Jawaban:

350

Anda pada dasarnya dapat mengembalikan kode Anda menggunakan beberapa metode bawaan lainnya.

byte[] decodedString = Base64.decode(encodedImage, Base64.DEFAULT);
Bitmap decodedByte = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length); 
pengguna432209
sumber
23
pastikan Anda tidak melewatkan "data: image / jpg; base64" dan hanya meneruskan byte gambar .. Jangan lupa untuk mengubah string menjadi byte .. photoData = photoData.substring (photoData.indexOf (",") +1); byte [] decodedString = Base64.decode (photoData.getBytes (), Base64.DEFAULT); Semoga ini bisa membantu seseorang.
srinivasan
byte [] b = Base64.decode (sebelumnyaEncodedImage.getBytes (), Base64.DEFAULT); bitmap = BitmapFactory.decodeByteArray (b, 0, b.length); bitmap mengembalikan null dalam case.how saya untuk mengonversi string base 64 ke bitmap?
Rajesh
sudah dijawab Jika string encodedImage adalah respons JSON, cukup gunakan Base64.URL_SAFE alih-alih Base64.DEAULT
Chinmoy
7
Untuk menghapus data: gambar ... untuk png dan jpeg coba ini:String cleanImage = base64Image.replace("data:image/png;base64,", "").replace("data:image/jpeg;base64,","");
Luis Cabrera Benito
Pekerjaan Yang Luar Biasa Seperti Pesona ... +1
Vasudev Vyas
65

Untuk siapa pun yang masih tertarik dengan pertanyaan ini: Jika: 1-decodeByteArray mengembalikan null 2-Base64.decode melempar bad-base64 Pengecualian

Ini solusinya: -Anda harus mempertimbangkan nilai yang dikirimkan kepada Anda dari API adalah Base64 yang di-encode dan harus didekodekan terlebih dahulu untuk melemparkannya ke objek Bitmap! -Ayo Lihat String yang disandikan Base64 Anda, Jika dimulai dengan

data: image / jpg; base64

Base64.decode tidak akan dapat men-decode-nya, Jadi harus dihapus dari String Anda yang dikodekan:

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

Sekarang objek pureBase64Encoded siap didekodekan:

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

Sekarang cukup gunakan baris di bawah ini untuk mengubahnya menjadi Objek Bitmap ! :

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

Atau jika Anda menggunakan pustaka Glide yang hebat :

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

Ini harus melakukan pekerjaan! Satu hari ini terbuang sia-sia dan muncul solusi ini!

Catatan : Jika Anda masih mendapatkan kesalahan bad-base64 pertimbangkan flag Base64.decode lainnya seperti Base64.URL_SAFE dan seterusnya

MohammadReza
sumber
Saya mendapat base64 dari respons json, menggunakan Base.64.URL_SAFE mendapat kesalahan bad-base64, Memeriksa utas ini dan menyelesaikannya, Thumbs up man ..
livemaker
17

Ini adalah utas yang sangat lama tetapi berpikir untuk membagikan jawaban ini karena butuh banyak waktu pengembangan saya untuk mengelola NULLpengembalian BitmapFactory.decodeByteArray()seperti yang dihadapi @Anirudh.

Jika encodedImagestring adalah JSONrespons, gunakan saja Base64.URL_SAFEalih-alihBase64.DEAULT

byte[] decodedString = Base64.decode(encodedImage, Base64.URL_SAFE);
Bitmap decodedByte = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length);
tinggi lima
sumber
1
saya mendapatkan kesalahan bad-base64 (IllegalArgumentException) saat menggunakan Base64.URL_SAFE. Saya memverifikasi string base64 menggunakan tag img HTML. Saya melihat gambar di halaman HTML.
mudit
Hai @ Ambit, apakah Anda mengetahui cara memperbaiki pengecualian bad-base64? Jika demikian, apakah Anda keberatan untuk berbagi? Saya memiliki masalah yang sama. Sudah dua hari sekarang dan kehabisan ide.
ito
@ito pastikan Anda tidak melewatkan "data: image / jpg; base64" dan hanya meneruskan byte gambar .. Jangan lupa untuk mengubah string menjadi byte .. photoData = photoData.substring (photoData.indexOf (", ") +1); byte [] decodedString = Base64.decode (photoData.getBytes (), Base64.DEFAULT);
srinivasan
Saya juga banyak berjuang untuk satu kata ini "Base64.URL_SAFE" ..... Saya mengambil json obj ... Terima kasih banyak
Chinmoy
11

Untuk mengecek online bisa Anda gunakan

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

Anda dapat mengonversi string menjadi gambar seperti ini

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
sumber
2
Menemukan situs web sangat berguna untuk mencari tahu apakah ada masalah dengan kode saya atau dengan data gambar. Terima kasih telah berbagi!
Mark O'Sullivan
2

Saya telah menemukan solusi mudah ini

Untuk mengkonversi dari bitmap ke Base64 gunakan metode ini.

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

Untuk mengkonversi dari Base64 ke bitmap ATAU kembali.

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