Як перетворити рядок Base64 у зображення Bitmap, щоб показати його у ImageView?


187

У мене є рядок Base64, що представляє зображення BitMap.

Мені потрібно знову перетворити цей рядок у зображення BitMap, щоб використовувати його на ImageView в моєму додатку Android

Як це зробити?

Це код, який я використовую для перетворення зображення в базовий64 String:

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

Відповіді:


350

Ви можете просто повернути код за допомогою інших вбудованих методів.

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

23
переконайтеся, що ви не передаєте "data: image / jpg; base64" і передаєте лише байти зображень .. Не забудьте змінити рядок на байти .. photoData = photoData.substring (photoData.indexOf (",") + 1); байт [] decodedString = Base64.decode (photoData.getBytes (), Base64.DEFAULT); Сподіваюся, це комусь допомагає.
srinivasan

байт [] b = Base64.decode (ранішеEncodedImage.getBytes (), Base64.DEFAULT); bitmap = BitmapFactory.decodeByteArray (b, 0, b.length); bitmap повертає null в моєму case.how для перетворення базової 64 рядка в bitmap?
Раджеш

як отвеченних вже Якщо рядок encodedImage є відповіддю JSON, просто використовувати Base64.URL_SAFE замість Base64.DEAULT
Чинмоя

7
Щоб видалити дані: зображення ... і для png, і для jpeg, спробуйте це:String cleanImage = base64Image.replace("data:image/png;base64,", "").replace("data:image/jpeg;base64,","");
Луїс Кабрера Беніто,

Вишукана робота Як Шарм ... +1
Vasudev Віас

65

Для всіх, хто все ще цікавиться цим питанням: Якщо: 1-decodeByteArray повертає нульовий 2-Base64.decode кидає bad-base64 Виняток

Ось таке рішення: - Вам слід розглянути значення, надіслане вам від API - Base64 Encoded, і його слід розшифрувати спочатку, щоб передати його об'єкту Bitmap! -Перегляньте свою кодовану Base64 String, якщо вона починається з

дані: image / jpg; base64

Код Base64.de не зможе його розшифрувати, тому його потрібно видалити з кодованої рядки:

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

Тепер об'єкт pureBase64Encoded готовий до декодування:

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

Тепер просто використовуйте рядок нижче, щоб перетворити це на об'єкт Bitmap ! :

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

Або якщо ви використовуєте велику бібліотеку Glide :

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

Це має зробити роботу! Він витратив день на це і придумав це рішення!

Примітка : Якщо ви все ще отримуєте помилку-base64, розгляньте інші прапорці Base64.decode, такі як Base64.URL_SAFE тощо


Я отримав base64 від відповіді json, використав Base.64.URL_SAFE отримав помилку-base64 помилку, перевірив цю тему та вирішив,
Пальцем

17

Це дуже стара тема, але я вирішив поділитися цією відповіддю, оскільки на управління нею знадобилося багато часу NULL поверненням, BitmapFactory.decodeByteArray()як зіткнувся @Anirudh.

Якщо encodedImageрядок є JSONвідповіддю, просто використовуйте Base64.URL_SAFEзамістьBase64.DEAULT

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

1
я отримую помилку base-base64 (IllegalArgumentException) при використанні Base64.URL_SAFE. Я перевірив рядок base64 за допомогою тегу HTML img. Я бачу зображення на HTML-сторінці.
мудіт

Привіт @mudit, ти придумав, як виправити виняток bad-base64? Якщо так, ви не проти поділитися? У мене те саме питання. Вже два дні і не вистачає ідей.
іто

@ito переконайтеся, що ви не передаєте "data: image / jpg; base64" і передаєте лише байти зображень .. Не забудьте змінити рядок на байти .. photoData = photoData.substring (photoData.indexOf (", ") + 1); байт [] decodedString = Base64.decode (photoData.getBytes (), Base64.DEFAULT);
srinivasan

Я занадто багато боровся за це одне слово "Base64.URL_SAFE" ..... Я добирався як json obj ... Дякую тонну
Chinmoy

11

Для перевірки в Інтернеті ви можете скористатися

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

Ви можете конвертувати рядок у зображення таким чином

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
Знайшов веб-сайт дуже корисним для з'ясування, чи є проблема з моїм кодом або із зображеннями даних. Дякую, що поділились!
Марк О'Салліван

2

Я знайшов це просте рішення

Для перетворення з растрової карти в Base64 використовуйте цей метод.

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

Щоб перетворити з Base64 в растрове зображення АБО відновити.

private Bitmap convertBase64ToBitmap(String b64) {
    byte[] imageAsBytes = Base64.decode(b64.getBytes(), Base64.DEFAULT);
    return BitmapFactory.decodeByteArray(imageAsBytes, 0, imageAsBytes.length);
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.