Bitmap de Android a la cadena Base64

¿Cómo puedo convertir un Bitmap grande (foto tomada con la cámara del teléfono) a una cadena de Base64?

Utilice el siguiente método para convertir el mapa de bits en matriz de bytes:

ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOutputStream); byte[] byteArray = byteArrayOutputStream .toByteArray(); 

Codificar base64 de matriz de bytes utilizar el siguiente método

 String encoded = Base64.encodeToString(byteArray, Base64.DEFAULT); 

El problema con la respuesta de jeet es que carga todos los bytes de la imagen en una matriz de bytes, lo que probablemente bloqueará la aplicación en dispositivos de gama baja. En su lugar, primero escribiría la imagen en un archivo y lo leería usando la clase Base64InputStream de Apache. A continuación, puede crear la cadena Base64 directamente desde el InputStream de ese archivo. Se verá así:

 //Don't forget the manifest permission to write files final FileOutputStream fos = new FileOutputStream(yourFileHere); bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos); fos.close(); final InputStream is = new Base64InputStream( new FileInputStream(yourFileHere) ); //Now that we have the InputStream, we can read it and put it into the String final StringWriter writer = new StringWriter(); IOUtils.copy(is , writer, encoding); final String yourBase64String = writer.toString(); 

Como puede ver, la solución anterior funciona directamente con los flujos, evitando la necesidad de cargar todos los bytes en una variable, lo que hace que la huella de la memoria sea mucho más baja y menos probable que se bloquee en los dispositivos de gama baja. Todavía existe el problema de que poner la cadena Base64 en una variable String no es una buena idea, porque, de nuevo, podría causar errores OutOfMemory. Pero al menos hemos reducido el consumo de memoria a la mitad eliminando la matriz de bytes.

Si desea omitir el paso de escritura a archivo, debe convertir el OutputStream en un InputStream, que no es tan sencillo de hacer (debe utilizar PipedInputStream, pero es un poco más complejo ya que los dos flujos deben siempre Estar en diferentes hilos).

Tengo una solución rápida. Basta con crear un archivo ImageUtil.java

 import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.util.Base64; import java.io.ByteArrayOutputStream; public class ImageUtil { public static Bitmap convert(String base64Str) throws IllegalArgumentException { byte[] decodedBytes = Base64.decode( base64Str.substring(base64Str.indexOf(",") + 1), Base64.DEFAULT ); return BitmapFactory.decodeByteArray(decodedBytes, 0, decodedBytes.length); } public static String convert(Bitmap bitmap) { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream); return Base64.encodeToString(outputStream.toByteArray(), Base64.DEFAULT); } } 

Uso:

 Bitmap bitmap = ImageUtil.convert(base64String); 

o

 String base64String = ImageUtil.convert(bitmap); 

Use getPixels para obtener el mapa de bits como una matriz de bytes. A continuación, puede utilizar Base64.encodeToString para realizar la codificación. Esto sólo funcionará para API de nivel 8 y mayor. Consulte esta pregunta para los dispositivos más antiguos.

Pruebe esto, la primera escala de su imagen a la anchura y la altura requerida, acaba de pasar su mapa de bits original, el ancho requerido y la altura necesaria para el siguiente método y obtener bitmap a escala en cambio:

Por ejemplo: Bitmap scaledBitmap = getScaledBitmap (originalBitmap, 250, 350);

 private Bitmap getScaledBitmap(Bitmap b, int reqWidth, int reqHeight) { int bWidth = b.getWidth(); int bHeight = b.getHeight(); int nWidth = bWidth; int nHeight = bHeight; if(nWidth > reqWidth) { int ratio = bWidth / reqWidth; if(ratio > 0) { nWidth = reqWidth; nHeight = bHeight / ratio; } } if(nHeight > reqHeight) { int ratio = bHeight / reqHeight; if(ratio > 0) { nHeight = reqHeight; nWidth = bWidth / ratio; } } return Bitmap.createScaledBitmap(b, nWidth, nHeight, true); } 

Ahora simplemente pase su mapa de bits a escala al siguiente método y obtenga una cadena base64 a cambio:

Por ejemplo: String base64String = getBase64String (scaledBitmap);

 private String getBase64String(Bitmap bitmap) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos); byte[] imageBytes = baos.toByteArray(); String base64String = Base64.encodeToString(imageBytes, Base64.NO_WRAP); return base64String; } 

Para decodificar la cadena base64 de nuevo a imagen de mapa de bits:

 byte[] decodedByteArray = Base64.decode(base64String, Base64.NO_WRAP); Bitmap decodedBitmap = BitmapFactory.decodeByteArray(decodedByteArray, 0, decodedString.length); 
  • Android: Cambiar el tamaño de un archivo de mapa de bits grande a un archivo de salida escalado
  • ¿Cómo puedo convertir el mapa de bits de Android a formato de color NV12?
  • Dibujar objeto / imagen sobre lienzo
  • Cómo solucionar problemas de java.lang.OutOfMemoryError en Android
  • Mapa de bits a gran error se queja de dos veces el tamaño de la imagen
  • Android: cómo convertir matriz de bytes a mapa de bits?
  • Usando setScale y setTranslate (Matrix)
  • Utilizar Picasso para obtener una devolución de llamada con un mapa de bits
  • Obtener el tamaño de Bitmap Android
  • OutOfMemoryError mientras decodifica y codifica Base64 String en Bitmap
  • Escala de un mapa de bits para encajar en un lienzo
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.