android - encodetostring - ¿Cómo convertir una imagen en una cadena Base64?
imagen base64 android (9)
¿Puede alguien decirme el código para transformar una imagen (máximo de 200 KB) en Base64 String?
Necesito saber cómo hacerlo con Android, porque tengo que agregar la funcionalidad para cargar imágenes a un servidor remoto en mi aplicación principal poniéndolas en una fila de la base de datos, como una cadena.
Estoy buscando en Google y en StackOverflow, pero no pude encontrar ejemplos fáciles que me pueda permitir y también encontré algunos ejemplos, pero no están hablando de transformarse en String. Entonces necesito transformarme en una cadena para subirla por JSON a mi servidor remoto.
A continuación se encuentran los pseudocódigos que pueden ayudarte:
public String getBase64FromFile(String path)
{
Bitmap bmp = null;
ByteArrayOutputStream baos = null;
byte[] baat = null;
String encodeString = null;
try
{
bmp = BitmapFactory.decodeFile(path);
baos = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.JPEG, 100, baos);
baat = baos.toByteArray();
encodeString = Base64.encodeToString(baat, Base64.DEFAULT);
}
catch (Exception e)
{
e.printStackTrace();
}
return encodeString;
}
En lugar de utilizar Bitmap
, también puede hacerlo a través de InputStream
trivial. Bueno, no estoy seguro, pero creo que es un poco eficiente
InputStream inputStream = new FileInputStream(fileName);//You can get an inputStream using any IO API
byte[] bytes;
byte[] buffer = new byte[8192];
int bytesRead;
ByteArrayOutputStream output = new ByteArrayOutputStream();
try {
while ((bytesRead = inputStream.read(buffer)) != -1) {
output.write(buffer, 0, bytesRead);
}
} catch (IOException e) {
e.printStackTrace();
}
bytes = output.toByteArray();
String encodedString = Base64.encodeToString(bytes, Base64.DEFAULT);
Puedes usar la clase Base64 de Android:
String encodedImage = Base64.encodeToString(byteArrayImage, Base64.DEFAULT);
Sin embargo, tendrás que convertir tu imagen en una matriz de bytes. Aquí hay un ejemplo:
Bitmap bm = BitmapFactory.decodeFile("/path/to/image.jpg");
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bm.compress(Bitmap.CompressFormat.JPEG, 100, baos); //bm is the bitmap object
byte[] b = baos.toByteArray();
* Actualización *
Si está usando una biblioteca SDK anterior (porque quiere que funcione en teléfonos con versiones anteriores del sistema operativo), no tendrá la clase Base64 empaquetada (ya que solo salió en API nivel 8 también conocido como versión 2.2).
Verifique este artículo para una solución alternativa:
http://androidcodemonkey.blogspot.com/2010/03/how-to-base64-encode-decode-android.html
Si estás haciendo esto en Android , aquí hay un ayudante copiado de la base de código de React Native :
import java.io.ByteArrayOutputStream;
import java.io.Closeable;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import android.util.Base64;
import android.util.Base64OutputStream;
import android.util.Log;
// You probably don''t want to do this with large files
// (will allocate a large string and can cause an OOM crash).
private String readFileAsBase64String(String path) {
try {
InputStream is = new FileInputStream(path);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
Base64OutputStream b64os = new Base64OutputStream(baos, Base64.DEFAULT);
byte[] buffer = new byte[8192];
int bytesRead;
try {
while ((bytesRead = is.read(buffer)) > -1) {
b64os.write(buffer, 0, bytesRead);
}
return baos.toString();
} catch (IOException e) {
Log.e(TAG, "Cannot read file " + path, e);
// Or throw if you prefer
return "";
} finally {
closeQuietly(is);
closeQuietly(b64os); // This also closes baos
}
} catch (FileNotFoundException e) {
Log.e(TAG, "File not found " + path, e);
// Or throw if you prefer
return "";
}
}
private static void closeQuietly(Closeable closeable) {
try {
closeable.close();
} catch (IOException e) {
}
}
Si necesita base64 sobre JSON, consulte Jackson : tiene soporte explícito para la lectura / escritura de datos binarios como base64 tanto en el nivel bajo (JsonParser, JsonGenerator) como en el nivel de enlace de datos. De modo que puede tener POJO con propiedades byte [] y la codificación / descodificación se maneja automáticamente. Y bastante eficiente también, si eso fuera importante.
Usa este código:
byte[ ] decodedString = Base64.decode(Base64String.getBytes(), Base64.DEFAULT);
Bitmap decodedByte = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length);
este código prefecto se ejecuta en mi proyecto
profile_image.buildDrawingCache();
Bitmap bmap = profile_image.getDrawingCache();
String encodedImageData =getEncoded64ImageStringFromBitmap(bmap);
public String getEncoded64ImageStringFromBitmap(Bitmap bitmap) {
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(CompressFormat.JPEG, 70, stream);
byte[] byteFormat = stream.toByteArray();
// get the base 64 string
String imgString = Base64.encodeToString(byteFormat, Base64.NO_WRAP);
return imgString;
}
// put the image file path into this method
public static String getFileToByte(String filePath){
Bitmap bmp = null;
ByteArrayOutputStream bos = null;
byte[] bt = null;
String encodeString = null;
try{
bmp = BitmapFactory.decodeFile(filePath);
bos = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.JPEG, 100, bos);
bt = bos.toByteArray();
encodeString = Base64.encodeToString(bt, Base64.DEFAULT);
}catch (Exception e){
e.printStackTrace();
}
return encodeString;
}
byte[] decodedString = Base64.decode(result.getBytes(), Base64.DEFAULT);