Base64文字列をビットマップ画像に変換して、ImageViewに表示する方法は?


187

ビットマップ画像を表す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);

回答:


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 [] decodeString = Base64.decode(photoData.getBytes()、Base64.DEFAULT); それが誰かのために役立つことを願っています。
srinivasan 2015年

byte [] b = Base64.decode(previouslyEncodedImage.getBytes()、Base64.DEFAULT); bitmap = BitmapFactory.decodeByteArray(b、0、b.length); ビットマップは私のケースでnullを返します。base64文字列をビットマップに変換する方法は?
Rajesh

すでに回答済みです。encodedImage文字列がJSON応答の場合は、Base64.DEAULTではなくBase64.URL_SAFEを使用してください
Chinmoy

7
両方のPNGのための...画像をしてみてください。このJPEG:データを削除するにはString cleanImage = base64Image.replace("data:image/png;base64,", "").replace("data:image/jpeg;base64,","");
ルイスカブレラベニート・

チャームのような素晴らしい仕事... +1
Vasudev Vyas

65

この質問にまだ関心を持っている人へ: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);

次の行を使用して、これをビットマップオブジェクトに変換してください。:

ビットマップdecodeBitmap = BitmapFactory.decodeByteArray(decodedBytes、0、decodeBytes.length);

または、素晴らしいライブラリGlideを使用している場合:

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

これでうまくいくはずです!これで1日が無駄になり、この解決策が思い付きました。

:bad-base64エラーが引き続き発生する場合は、Base64.URL_SAFEなどの他のBase64.decodeフラグを検討してください。


私はjson応答からbase64を取得し、Base.64を使用しました。URL_SAFEはbad-base64エラーを取得しました。このスレッドをチェックして解決しました
。Thumbsup

17

これは非常に古いスレッドですが、@ Anirudhが直面しているNULLようにBitmapFactory.decodeByteArray()、リターンを管理するために私の開発時間の多くを費やしたので、この答えを共有すると考えました。

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を使用すると、bad-base64(IllegalArgumentException)エラーが発生します。HTML imgタグを使用してbase64文字列を検証しました。HTMLページに画像が表示されています。
mudit 2015

こんにちは@ mudit、bad-base64例外を修正する方法を理解しましたか?もしそうなら、共有してもよろしいですか?同じ問題が発生しています。今から2日間、アイデアが不足しています。
伊東

@itoが「data:image / jpg; base64」を渡していないことを確認し、画像のバイトのみを渡します。文字列をバイトに変更することを忘れないでください。photoData = photoData.substring(photoData.indexOf( "、 ")+ 1); byte [] decodeString = Base64.decode(photoData.getBytes()、Base64.DEFAULT);
srinivasan 2015年

私もこの1つの単語 "Base64.URL_SAFE"に対して多くの苦労をしました。jsonobjとしてフェッチしていました...ありがとう、
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
私のコードまたは画像データに問題があったかどうかを把握するのに非常に役立つWebサイトが見つかりました。共有してくれてありがとう!
マークオサリバン

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.