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


187

我有一个Base64字符串,表示一个BitMap图像。

我需要再次将该String转换为BitMap图像,以在我的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);

Answers:


349

您基本上可以使用其他一些内置方法来还原代码。

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

22
确保您没有传递“ data:image / jpg; base64”并仅传递图像字节。.不要忘记将字符串更改为字节。.photoData = photoData.substring(photoData.indexOf(“,”) + 1); 字节[] decodedString = Base64.decode(photoData.getBytes(),Base64.DEFAULT); 希望它对某人有帮助。
srinivasan

byte [] b = Base64.decode(previouslyEncodedImage.getBytes(),Base64.DEFAULT);位图= BitmapFactory.decodeByteArray(b,0,b.length); 在我的情况下,位图返回null。如何将base 64字符串转换为位图?
Rajesh

如已经回答的那样,如果encodedImage字符串是JSON响应,只需使用Base64.URL_SAFE而不是Base64.DEAULT
Chinmoy

6
要删除png和jpeg的data:image ...,请尝试以下操作:String cleanImage = base64Image.replace("data:image/png;base64,", "").replace("data:image/jpeg;base64,","");
Luis Cabrera Benito

像Charm一样出色的工作... +1
Vasudev Vyas

65

对于仍然对该问题感兴趣的任何人:如果:1-decodeByteArray返回null 2-Base64.decode抛出bad-base64异常

解决方案如下:-您应该考虑从API发送给您的值是Base64编码的,应该首先进行解码才能将其转换为Bitmap对象!-看看您的Base64编码字符串,如果它以

数据:image / jpg; base64

Base64.decode将无法对其进行解码,因此必须将其从编码后的String中删除:

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

现在,pureBase64Encoded对象已准备好进行解码:

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

现在,只需使用下面的行将其转换为位图对象!:

位图encodedBitmap = BitmapFactory.decodeByteArray(decodedBytes,0,encodedBytes.length);

或者,如果您使用的大图书馆滑翔

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

这应该做的工作!在这上浪费了一天,然后想到了这个解决方案!

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


我从json响应中获取了base64,使用了Base.64.URL_SAFE,得到了bad-base64错误,检查了此线程并解决了,竖起大拇指了..
livemaker

17

这是一个非常古老的线程,但是想分享这个答案NULLBitmapFactory.decodeByteArray()因为@Anirudh面对我花了很多开发时间来管理return 。

如果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页面上看到图像。
–mugit

嗨@mudit,您知道如何解决bad-base64异常吗?如果是这样,您介意分享吗?我有相同的问题。现在已经有两天了,想法不多了。
ito 2015年

@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,2016年

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
发现该网站对于确定我的代码或图像数据是否存在问题非常有用。感谢分享!
Mark O'Sullivan

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);
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.