¿Cómo convertir una cadena Base64 en una imagen de mapa de bits para mostrarla en un ImageView?

188

Tengo una cadena Base64 que representa una imagen de BitMap.

Necesito transformar esa Cadena en una imagen de BitMap nuevamente para usarla en un ImageView en mi aplicación de Android

¿Cómo hacerlo?

Este es el código que uso para transformar la imagen en la cadena 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);
Excepción de puntero nulo
fuente

Respuestas:

351

Básicamente, puede revertir su código utilizando algunos otros métodos integrados.

byte[] decodedString = Base64.decode(encodedImage, Base64.DEFAULT);
Bitmap decodedByte = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length); 
user432209
fuente
23
asegúrese de no pasar los "datos: imagen / jpg; base64" y pase solo los bytes de la imagen. No olvide cambiar la cadena a bytes. photoData = photoData.substring (photoData.indexOf (",") + 1); byte [] decodedString = Base64.decode (photoData.getBytes (), Base64.DEFAULT); Espero que ayude para alguien.
srinivasan
byte [] b = Base64.decode (previamente EncodedImage.getBytes (), Base64.DEFAULT); mapa de bits = BitmapFactory.decodeByteArray (b, 0, b.length); el mapa de bits devuelve nulo en mi caso.¿Cómo convertir la cadena de base 64 a mapa de bits?
Rajesh
como ya se respondió Si la cadena de imagen codificada es una respuesta JSON, simplemente use Base64.URL_SAFE en lugar de Base64.DEAULT
Chinmoy
77
Para eliminar los datos: imagen ... tanto para png como para jpeg intente esto:String cleanImage = base64Image.replace("data:image/png;base64,", "").replace("data:image/jpeg;base64,","");
Luis Cabrera Benito
Excelente trabajo como encanto ... +1
Vasudev Vyas
65

Para cualquiera que todavía esté interesado en esta pregunta: Si: 1-decodeByteArray devuelve nulo 2-Base64.decode arroja una excepción bad-base64

Aquí está la solución: -¡Debe considerar que el valor que le envió la API es codificado en Base64 y debe decodificarse primero para convertirlo en un objeto de mapa de bits! -Eche un vistazo a su cadena codificada Base64, si comienza con

datos: imagen / jpg; base64

El Base64.decode no podrá decodificarlo, por lo que debe eliminarse de su cadena codificada:

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

Ahora el objeto pureBase64Encoded está listo para ser decodificado:

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

¡Ahora simplemente use la línea de abajo para convertir esto en un objeto de mapa de bits ! :

Mapa de bits decodedBitmap = BitmapFactory.decodeByteArray (decodedBytes, 0, decodedBytes.length);

O si está utilizando la gran biblioteca Glide :

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

¡Esto debería hacer el trabajo! ¡Se desperdició un día en esto y llegó a esta solución!

Nota : Si todavía recibe un error de mala base64, considere otros indicadores de Base64.decode como Base64.URL_SAFE, etc.

MohammadReza
fuente
Tengo base 64 de la respuesta JSON, que se utiliza Base.64.URL_SAFE ha obtenido un error mal-base 64, marcó esta hilo y resuelto, pulgares suben al hombre ..
livemaker
17

Este es un hilo muy antiguo, pero pensé en compartir esta respuesta, ya que me llevó mucho tiempo de desarrollo administrar el NULLretorno de BitmapFactory.decodeByteArray()@Anirudh.

Si la encodedImagecadena es una JSONrespuesta, simplemente use en Base64.URL_SAFElugar deBase64.DEAULT

byte[] decodedString = Base64.decode(encodedImage, Base64.URL_SAFE);
Bitmap decodedByte = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length);
Cinco altos
fuente
1
Recibo un error bad-base64 (IllegalArgumentException) cuando uso Base64.URL_SAFE. Verifiqué la cadena base64 usando una etiqueta img HTML. Estoy viendo la imagen en la página HTML.
mudit
Hola @mudit, ¿descubriste cómo solucionar la excepción bad-base64? Si es así, ¿te importaría compartir? Tengo el mismo problema. Hace ya dos días que se están quedando sin ideas.
ito
@ito asegúrese de que no está pasando los "datos: imagen / jpg; base64" y pase solo los bytes de la imagen. No olvide cambiar la cadena a bytes. photoData = photoData.substring (photoData.indexOf (", ") + 1); byte [] decodedString = Base64.decode (photoData.getBytes (), Base64.DEFAULT);
srinivasan
Yo también luché mucho por esta palabra "Base64.URL_SAFE" ..... Estaba buscando como json obj ... Muchas gracias
Chinmoy
11

Para verificar en línea puede usar

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

Puedes convertir cadenas a imágenes de esta manera

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
fuente
2
El sitio web me pareció muy útil para descubrir si había un problema con mi código o con los datos de la imagen. ¡Gracias por compartir!
Mark O'Sullivan
2

He encontrado esta solución fácil.

Para convertir de mapa de bits a 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 convertir de Base64 a mapa de bits O revertir.

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