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?
- Mover mapa de bits en lienzo
- Detectando OutOfMemoryError en la decodificación Bitmap
- Error de memoria insuficiente al utilizar la API de Google Maps
- Cómo rotar ruta de la misma manera que un mapa de bits
- Cómo crear un mapa de bits de un archivo de imagen en Android
- Cómo borrar la imagen con el dedo en Android
- Cómo dibujar un mapa de bits con transparencia
- Convertir imagen a mapa de bits en android
- Utilice MediaCodec y MediaExtractor para decodificar y codificar vídeo
- Guardar vista como mapa de bits, sólo obtener pantalla en negro
- Cómo configurar Compress-Options para WebP en Android
- Retraso en la demostración de uso de la imagen mapa de bits en android
- Android cómo escalar una imagen con las opciones de BitmapFactory
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?