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?
- Cómo teñir un mapa de bits de Android en blanco?
- Cómo puedo convertir un mapa de bits en formato PDF en android
- Convertir mapa de bits a archivo
- Android - Mientras maneja una imagen es mejor almacenarla o usarla en memoria temporal?
- Cómo convertir un LinearLayout en imagen?
- Eliminar la imagen de una vista de imagen Android
- Cómo almacenar objeto de mapa de bits en sharedferencias en android
- Cómo configurar el mapa de bits para el ImageView en main.xml capturado desde la cámara?
- Android calcula el hash de un mapa de bits
- Java.lang.OutOfMemoryError Incluso en un bloque try-catch?
- Imagen de Android seleccionada de la galería La orientación siempre es 0: Exif TAG
- Fondo de pantalla en vivo con imágenes
- Gire un ImageView en sentido horario usando ObjectAnimator
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);
- Vista de desplazamiento superpuesta con AppBarLayout
- ¿Por qué hierarchyviewer no funciona para Samsung Galaxy TAB 7.0?