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); 
  • ¿Cuál es la unidad de bitmap.getWidth () o bitmap.getHeight ()
  • Cómo rellenar gridview con la imagen seleccionada de la galería o capturada desde la cámara
  • Cómo crear borde blanco alrededor de mapa de bits?
  • ¿Convertir una vista a mapa de bits sin mostrarla en Android?
  • ¿Reutiliza Android las imágenes cargadas desde el recurso?
  • Android convertir vista XML a mapa de bits sin mostrarlo
  • BitmapFactory.decodeStream falta de memoria a pesar de usar tamaño de muestra reducido
  • Si se establece myBitmap = null sin recycle (), qué diferencia con recycle ()
  • Android cómo configurar la opacidad en bitmap xml
  • Android Drawable.createFromStream ha asignado demasiada memoria
  • Android: Conexión e impresión a Bixolon SPP-R200
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.