Как преобразовать строку Base64 в растровое изображение, чтобы показать его в ImageView?

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

Мне нужно снова преобразовать эту строку в изображение BitMap, чтобы использовать его в ImageView в моем приложении для Android.

Как это сделать?

Это код, который я использую для преобразования изображения в строку 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);

person NullPointerException    schedule 29.01.2011    source источник


Ответы (8)


Вы можете просто вернуть свой код, используя некоторые другие встроенные методы.

byte[] decodedString = Base64.decode(encodedImage, Base64.DEFAULT);
Bitmap decodedByte = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length); 
person user432209    schedule 29.01.2011
comment
убедитесь, что вы не передаете данные: image / jpg; base64, а передаете только байты изображения .. Не забудьте изменить строку на байты .. photoData = photoData.substring (photoData.indexOf (,) + 1); byte [] decodedString = Base64.decode (photoData.getBytes (), Base64.DEFAULT); Надеюсь, это кому-то поможет. - person srinivasan; 22.10.2015
comment
byte [] b = Base64.decode (ранее EncodedImage.getBytes (), Base64.DEFAULT); растровое изображение = BitmapFactory.decodeByteArray (b, 0, b.length); bitmap возвращает null в моем случае. как преобразовать строку base 64 в bitmap? - person Rajesh; 12.12.2015
comment
как уже ответил Если строка encodedImage является ответом JSON, просто используйте Base64.URL_SAFE вместо Base64.DEAULT - person Chinmoy; 25.08.2016
comment
Чтобы удалить data: image ... как для png, так и для jpeg, попробуйте следующее: String cleanImage = base64Image.replace("data:image/png;base64,", "").replace("data:image/jpeg;base64,",""); - person Luis Cabrera Benito; 28.06.2018
comment
Превосходная работа как очарование ... +1 - person Vasudev Vyas; 11.05.2019

Для всех, кто все еще интересуется этим вопросом: если: 1-decodeByteArray возвращает null 2-Base64.decode выдает исключение bad-base64

Вот решение: -Вы должны учитывать, что значение, отправленное вам из API, закодировано в Base64 и должно быть сначала декодировано, чтобы преобразовать его в объект Bitmap! -Посмотрите на свою строку в кодировке Base64, если она начинается с

данные: изображение / jpg; base64

Base64.decode не сможет его декодировать, поэтому его необходимо удалить из закодированной строки:

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

Это должно сработать! Он потратил на это один день и пришел к такому решению!

Примечание. Если вы по-прежнему получаете ошибку bad-base64, рассмотрите другие флаги Base64.decode, такие как Base64.URL_SAFE и т. д.

person MohammadReza    schedule 04.03.2016
comment
Я получил base64 из ответа json, использовал Base.64.URL_SAFE получил ошибку bad-base64, проверил этот поток и решил, палец вверх ... - person livemaker; 24.08.2017

Это очень старый поток, но я подумал поделиться этим ответом, поскольку у меня ушло много времени на разработку, чтобы управлять 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);
person highfive    schedule 26.11.2014
comment
я получаю ошибку bad-base64 (IllegalArgumentException) при использовании Base64.URL_SAFE. Я проверил строку base64 с помощью тега HTML img. Я вижу изображение на HTML-странице. - person mudit; 11.02.2015
comment
Привет @mudit, вы придумали, как исправить исключение bad-base64? Если да, не могли бы вы поделиться? У меня такая же проблема. Вот уже два дня и заканчиваются идеи. - person ito; 10.06.2015
comment
@ito убедитесь, что вы не передаете данные: image / jpg; base64 и передаете только байты изображения .. Не забудьте изменить строку на байты .. photoData = photoData.substring (photoData.indexOf (,) + 1 ); byte [] decodedString = Base64.decode (photoData.getBytes (), Base64.DEFAULT); - person srinivasan; 22.10.2015
comment
Я тоже много боролся с этим одним словом Base64.URL_SAFE ..... Я получал как json obj ... Большое спасибо - person Chinmoy; 25.08.2016

Чтобы проверить онлайн, вы можете использовать

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.

person Aditya Vyas-Lakhan    schedule 17.02.2017
comment
Нашел веб-сайт очень полезным для выяснения, была ли проблема с моим кодом или данными изображения. Спасибо, что поделился! - person Mark O'Sullivan; 22.08.2017

Это отличный образец:

String base64String = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAA...";
String base64Image = base64String.split(",")[1];
byte[] decodedString = Base64.decode(base64Image, Base64.DEFAULT);
Bitmap decodedByte = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length);
imageView.setImageBitmap(decodedByte);

Образец найден по адресу: https://freakycoder.com/android-notes-44-how-to-convert-base64-string-to-bitmap-53f98d5e57af

Это единственный код, который работал у меня в прошлом.

person Thiago    schedule 14.08.2020
comment
да, я определенно не мог заставить это работать без разделения после запятой. Я думаю, это должен быть принятый ответ, спасибо !! - person greenhouse; 13.04.2021

Я нашел это простое решение

Используйте этот метод для преобразования из растрового изображения в 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);
}
person Abdul Basit Rishi    schedule 18.12.2019

В Kotlin вы можете использовать функцию расширения, как показано ниже:

fun String.base64ToByteCode() = Base64.decode(this.substring(this.indexOf(",")  + 1), Base64.DEFAULT)

и назовите его, как показано ниже:

yourBase64String.base64ToByteCode()
person Ali A. Jalil    schedule 16.07.2021

Я перепробовал все решения, и это сработало для меня

let temp = base64String.components(separatedBy: ",")
let dataDecoded : Data = Data(base64Encoded: temp[1], options: 
 .ignoreUnknownCharacters)!
let decodedimage = UIImage(data: dataDecoded)

yourImage.image = decodedimage
person Nihas Nizar    schedule 02.01.2021