如何将Base64字符串转换为位图图像以在ImageView中显示?

238

我有一个表示位图图像的Base64字符串。

我需要将该字符串转换回位图图像,以便在Android应用程序中使用它在ImageView上。

如何实现?

这是我用来将图像转换为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个回答

430

您可以使用其他内置方法来简单地回滚您的代码。

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

34
确保您不传递"data:image/jpg;base64",只传递图像字节。不要忘记将字符串更改为字节。photoData = photoData.substring(photoData.indexOf(",") + 1); byte[] decodedString = Base64.decode(photoData.getBytes(), Base64.DEFAULT); 希望对某些人有所帮助。 - srinivasan
如果encodedImage字符串是JSON响应,则只需使用Base64.URL_SAFE而不是Base64.DEFAULT。 - Chinmoy
14
为了删除 PNG 和 JPEG 格式的 base64 图像数据,请尝试以下代码: String cleanImage = base64Image.replace("data:image/png;base64,", "").replace("data:image/jpeg;base64,",""); - Luis Cabrera Benito

81

对于仍然对这个问题感兴趣的人:

如果:

  1. decodeByteArray 返回 null
  2. Base64.decode 抛出 bad-base64 异常

解决方法如下:

  • 你应该考虑从 API 接收到的值是 Base64 编码的,需要先解码才能将其转换为位图对象!
  • 查看你的 Base64 编码字符串,如果它以

data:image/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);

这应该能完成工作!我花了一天时间才想出这个解决方案!

注意:如果你仍然遇到坏的base64错误,请考虑使用其他Base64.decode标志,如Base64.URL_SAFE等。


1
我从JSON响应中获取了Base64,使用Base.64.URL_SAFE时出现了错误,查看了这个线程并解决了问题,点赞! - livemaker

18

这是一个非常古老的帖子,但是我想分享这个答案,因为它花费了我很多开发时间来处理 BitmapFactory.decodeByteArray()NULL 返回,就像 @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
当我使用Base64.URL_SAFE时,出现了一个坏的base64(IllegalArgumentException)错误。我使用HTML img标签验证了base64字符串。我在HTML页面上看到了这张图片。 - mudit
嗨@mudit,你解决了如何修复坏的base64异常吗?如果可以的话,能否分享一下?我也遇到了同样的问题。已经两天了,想不出办法了。 - ito
@ito 确保你没有传递 "data:image/jpg;base64",仅传递图像字节.. 不要忘记将字符串更改为字节.. photoData = photoData.substring(photoData.indexOf(",") + 1); byte[] decodedString = Base64.decode(photoData.getBytes(), Base64.DEFAULT); - srinivasan
我也为一个单词“Base64.URL_SAFE”苦苦挣扎......我正在获取JSON对象...非常感谢! - Chinmoy

14

您可以使用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);
    }
}

Android将图像转换为Base64字符串和Base64字符串转换为图像


3
发现这个网站非常有用,可以帮助我确定代码或图像数据是否存在问题。谢谢分享! - Mark O'Sullivan

8

这是一个很好的示例:

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

以下代码曾经是唯一有效的。


2
是的,如果不在逗号后面分割,我肯定无法让它正常工作。我认为这应该是被接受的答案,谢谢! - greenhouse

5

我找到了这个简单的解决方案

将位图转换为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);
}

2
在 Kotlin 中,您可以像下面这样使用扩展函数:
fun String.base64ToByteCode() = Base64.decode(this.substring(this.indexOf(",")  + 1), Base64.DEFAULT)

并将其作为以下内容进行调用:

yourBase64String.base64ToByteCode()

你可以将 this.substring(this.indexOf(",") + 1) 替换为 substringAfter(",") - tasjapr

1

这个解决方案对我来说很有效。如果你收到了null,请告诉我。

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

如果您决定使用Glide,您可以直接将base64字符串加载到imageView中。无需自己解码,只需将您的base64字符串传递给Glide,它就会完成重置。 - Khalid ElSayed

0
在 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)

0

我尝试了所有的解决方案,这个对我起作用了

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

yourImage.image = decodedimage

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接