Como converter uma seqüência de caracteres Base64 em uma imagem de Bitmap para mostrá-la em um ImageView?

187

Eu tenho uma String Base64 que representa uma imagem BitMap.

Preciso transformar essa String em uma imagem BitMap novamente para usá-la em um ImageView no meu aplicativo Android

Como fazer isso?

Este é o código que eu uso para transformar a imagem na string 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);
Null Pointer Exception
fonte

Respostas:

350

Você pode basicamente reverter seu código usando outros métodos integrados.

byte[] decodedString = Base64.decode(encodedImage, Base64.DEFAULT);
Bitmap decodedByte = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length); 
user432209
fonte
23
certifique-se de não passar os "dados: imagem / jpg; base64" e passe apenas os bytes da imagem. Não se esqueça de alterar a seqüência de caracteres para bytes .. photoData = photoData.substring (photoData.indexOf (",") + 1); byte [] decodedString = Base64.decode (photoData.getBytes (), Base64.DEFAULT); Espero que ajude alguém.
Srcivasan
byte [] b = Base64.decode (previamenteEncodedImage.getBytes (), Base64.DEFAULT); bitmap = BitmapFactory.decodeByteArray (b, 0, b.length); bitmap retorna nulo no meu case.how converter base 64 string em bitmap?
Rajesh
como já respondidas Se a string EncodedImage é uma resposta JSON, basta usar Base64.URL_SAFE vez de Base64.DEAULT
Chinmoy
7
Para remover os dados: a imagem ... tanto para PNG e JPEG tente o seguinte:String cleanImage = base64Image.replace("data:image/png;base64,", "").replace("data:image/jpeg;base64,","");
Luis Cabrera Benito
Excelente trabalho como charme ... +1
Vasudev Vyas
65

Para quem ainda está interessado nesta pergunta: Se: 1-decodeByteArray retornar nulo 2-Base64.decode lança a exceção bad-base64

Aqui está a solução: -Você deve considerar que o valor enviado a você pela API é codificado em Base64 e deve ser decodificado primeiro para convertê-lo em um objeto Bitmap! -Veja a String codificada em Base64, se começar com

data: image / jpg; base64

O Base64.decode não poderá decodificá-lo, portanto, ele deve ser removido da sua String codificada:

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

Agora o objeto pureBase64Encoded está pronto para ser decodificado:

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

Agora basta usar a linha abaixo para transformar isso em um objeto Bitmap ! :

Bitmap decodedBitmap = BitmapFactory.decodeByteArray (decodedBytes, 0, decodedBytes.length);

Ou se você estiver usando a ótima biblioteca Glide :

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

Isso deve fazer o trabalho! Perdeu um dia com isso e chegou a esta solução!

Nota : Se você ainda estiver recebendo o erro bad-base64, considere outros sinalizadores Base64.decode como Base64.URL_SAFE e assim por diante

MohammadReza
fonte
Eu tenho base64 de resposta JSON, usado Base.64.URL_SAFE obteve o erro bad-base64, verificado esta discussão e resolvido, polegares levantam o homem ..
livemaker
17

Este é um tópico muito antigo, mas pensei em compartilhar esta resposta, pois demorou muito do meu tempo de desenvolvimento para gerenciar o NULLretorno BitmapFactory.decodeByteArray()como o @Anirudh enfrentou.

Se a encodedImagesequência for uma JSONresposta, basta usar em Base64.URL_SAFEvez deBase64.DEAULT

byte[] decodedString = Base64.decode(encodedImage, Base64.URL_SAFE);
Bitmap decodedByte = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length);
toca aqui
fonte
1
Estou recebendo um erro ruim-base64 (IllegalArgumentException) ao usar Base64.URL_SAFE. Eu verifiquei a string base64 usando uma tag img HTML. Estou vendo a imagem na página HTML.
mudit
Oi @mudit, você descobriu como corrigir a exceção bad-base64? Se sim, você gostaria de compartilhar? Estou tendo o mesmo problema. Já faz dois dias e está ficando sem ideias.
ito
@ito certifique-se de não passar os "dados: imagem / jpg; base64" e passe apenas os bytes da imagem. Não se esqueça de alterar a string para bytes. photoData = photoData.substring (photoData.indexOf (", ") + 1); byte [] decodedString = Base64.decode (photoData.getBytes (), Base64.DEFAULT);
srinivasan
Eu também lutei muito para esta única palavra "Base64.URL_SAFE" ..... eu estava buscando como JSON obj ... Graças a tonelada
Chinmoy
11

Para verificar online, você pode usar

http://codebeautify.org/base64-to-image-converter

Você pode converter string em imagem dessa maneira

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

Aditya Vyas-Lakhan
fonte
2
Achei o site muito útil para descobrir se havia um problema com meu código ou com os dados da imagem. Obrigado por compartilhar!
Mark O'Sullivan
2

Encontrei esta solução fácil

Para converter de bitmap em Base64, use este método.

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

Para converter de Base64 em bitmap OU reverter.

private Bitmap convertBase64ToBitmap(String b64) {
    byte[] imageAsBytes = Base64.decode(b64.getBytes(), Base64.DEFAULT);
    return BitmapFactory.decodeByteArray(imageAsBytes, 0, imageAsBytes.length);
}
Abdul Basit Rishi
fonte