Как преобразовать строку Base64 в изображение BitMap, чтобы показать его в ImageView?
У меня есть Base64 String, который представляет изображение 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);
10 ответов
Вы можете просто вернуть свой код, используя некоторые другие встроенные методы.
byte[] decodedString = Base64.decode(encodedImage, Base64.DEFAULT);
Bitmap decodedByte = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length);
Всем, кто все еще интересуется этим вопросом: If: 1-decodeByteArray возвращает ноль 2-Base64.decode выдает исключение bad-base64
Вот решение: -Вы должны учитывать, что значение, отправленное вам из API, является Base64 Encoded и должно быть сначала декодировано, чтобы привести его к объекту 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 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 и т. Д.
Это очень старая ветка, но я решил поделиться этим ответом, так как мне потребовалось много времени на разработку 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);
Чтобы проверить онлайн вы можете использовать
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);
}
}
Это отличный образец:
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
Это единственный код, который работал у меня в прошлом.
Я нашел это простое решение
Для преобразования из растрового изображения в 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);
}
В Kotlin вы можете использовать функцию расширения, как показано ниже:
fun String.base64ToByteCode() = Base64.decode(this.substring(this.indexOf(",") + 1), Base64.DEFAULT)
и назовите его ниже:
yourBase64String.base64ToByteCode()
Это решение отлично работает для меня. если вы получите ноль, пожалуйста, дайте мне знать.
private void bytesToImage(ImageView imageView, String base64String) {
if (!base64String.isEmpty()) {
byte[] bytes = Base64.decode(base64String, Base64.DEFAULT);
Bitmap decodedByte = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
Glide.with(this).load(decodedByte).into(imageView);
}
Я пробовал все решения, и это сработало для меня
let temp = base64String.components(separatedBy: ",")
let dataDecoded : Data = Data(base64Encoded: temp[1], options:
.ignoreUnknownCharacters)!
let decodedimage = UIImage(data: dataDecoded)
yourImage.image = decodedimage
В Kotlin вы можете создать функцию расширения для ImageView, как показано ниже:
fun ImageView.loadFromBase64(encodedImageString: String) {
try {
val base64Image = encodedImageString.split(",")[1]
val decodedString = Base64.decode(base64Image, Base64.DEFAULT)
val bitmap =
BitmapFactory.decodeByteArray(decodedString,0,decodedString.size)
setImageBitmap(bitmap)
} catch (e: Exception) {
Timber.d("Error loading image from base64: ${e.message}")
}
}
На этапе использования вы можете легко сделать:
imageView.loadFromBase64(encodedImageString)