Base64 문자열을 비트 맵 이미지로 변환하여 ImageView에 표시하는 방법은 무엇입니까?


187

BitMap 이미지를 나타내는 Base64 String이 있습니다.

내 Android 앱의 ImageView에서 사용하려면 해당 문자열을 BitMap 이미지로 다시 변환해야합니다.

어떻게합니까?

이것은 이미지를 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);

답변:


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); byte [] decodedString = Base64.decode (photoData.getBytes (), Base64.DEFAULT); 누군가에게 도움이되기를 바랍니다.
srinivasan

byte [] b = Base64.decode (이전 EncodedImage.getBytes (), Base64.DEFAULT); 비트 맵 = BitmapFactory.decodeByteArray (b, 0, b.length); 내 경우 비트 맵이 null을 반환합니다. 기본 64 문자열을 비트 맵으로 변환하는 방법은 무엇입니까?
Rajesh

이미 답변 된 바와 같이 encodeImageImage 문자열이 JSON 응답 인 경우 간단히 Base64.DEA 대신 Base64.URL_SAFE를 사용하십시오. DEAULT
Chinmoy

7
모두 PNG에 대한 ... 이미지를이 시도 JPEG : 데이터를 제거하려면String cleanImage = base64Image.replace("data:image/png;base64,", "").replace("data:image/jpeg;base64,","");
루이스 카브레라 베니토

매력처럼 훌륭한 작품 ... +1
Vasudev Vyas

65

이 질문에 여전히 관심이있는 사람에게 : If : 1-decodeByteArray는 null 2-Base64를 반환합니다.

해결책은 다음과 같습니다.-API에서 보낸 값이 Base64로 인코딩되어 있고 비트 맵 객체로 캐스트하려면 먼저 디코딩해야합니다. 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);

이제 아래 줄을 사용하여 이것을 비트 맵 객체 로 바꾸십시오 ! :

비트 맵 decodedBitmap = BitmapFactory.decodeByteArray (decodedBytes, 0, decodedBytes.length);

또는 훌륭한 라이브러리 Glide를 사용하는 경우 :

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

이것은 일을해야합니다! 이것에 하루가 낭비 되었고이 솔루션을 찾았습니다!

참고 : 여전히 나쁜 base64 오류가 발생하면 Base64.URL_SAFE 등과 같은 다른 Base64.decode 플래그를 고려하십시오.


json 응답에서 base64를 얻었으며 Base.64.URL을 사용했습니다. URL_SAFE에서 잘못된 base64 오류가 발생했습니다.이 스레드를 확인하고 해결했습니다. Thumbs up man ..
livemaker

17

이것은 매우 오래된 스레드이지만 @Anirudh가 직면 한 것처럼 NULL반환 을 관리하는 데 많은 개발 시간이 필요했기 때문에이 답변을 공유한다고 생각했습니다 BitmapFactory.decodeByteArray().

는 IF 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, bad-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 obj로 가져오고 있었다 ... Thanks a ton
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
내 코드 또는 이미지 데이터에 문제가 있는지 알아내는 데 웹 사이트가 매우 유용하다는 것을 알았습니다. 공유해 주셔서 감사합니다!
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);
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.