2011-01-28 21 views
124

¿Alguien puede decirme el código para transformar una imagen (máximo de 200 KB) en Base64 String?¿Cómo convertir una imagen en una cadena de Base64?

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 puedo pagar 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.

+4

@ user609239 Enlace roto – rmirabelle

Respuesta

271

Puede utilizar la clase base 64 Android:

String encodedImage = Base64.encodeToString(byteArrayImage, Base64.DEFAULT); 

Vas a tener que convertir la imagen en una matriz de bytes sin embargo. He aquí 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á utilizando una biblioteca SDK de más edad (ya que desea que funcione en teléfonos con versiones anteriores del sistema operativo) que no tendrá la clase Base64 empaquetada (ya que acaba de salir en API nivel 8 también conocido como versión 2.2).

Comprobar este artículo para una solución alternativa:

http://androidcodemonkey.blogspot.com/2010/03/how-to-base64-encode-decode-android.html

+0

gracias, y cómo hacer que byteArrayImage formar un jpg? – NullPointerException

+6

Actualizó la respuesta para usted. – xil3

+0

ok, y les puedo poner esa cadena (encondedImage) en una columna de base de datos remota con PHP + JSON ???? ¿Qué tipo debe ser la columna de la base de datos? VARCHAR? – NullPointerException

6

Si necesitas base 64 sobre JSON, echa un vistazo a Jackson: tiene un apoyo explícito a los datos binarios de lectura/escritura como base 64, tanto a nivel bajo (JsonParser, JsonGenerator) y 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.

+1

demasiado difícil para mí, mis habilidades son muy bajas con esto, lo he comprobado en google y no puedo encontrar ejemplos fáciles ... tal vez si me puedes dar ejemplos de código como xil3 lo entenderé – NullPointerException

+4

¿De verdad leíste el enlace en mi respuesta? – StaxMan

+1

Enlace roto. Por favor actualice. – Ajji

84

En lugar de usar Bitmap, también puede hacerlo a través del trivial InputStream. Así que no estoy seguro, pero creo que es un poco eficientes

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); 
+1

Por supuesto, esto es más eficiente; simplemente transforma un archivo en su representación base64 y evita una recompresión absolutamente sin sentido de la imagen. – ElYeante

+2

+1 para mostrar una forma más eficiente de hacerlo. – xil3

+0

es el nombre de archivo aquí la ruta del archivo o el nombre real del archivo ??? Por favor no te olvides de etiquetarme :) Gracias. –

3

este código prefecto funcionamiento 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; 
} 
0
byte[] decodedString = Base64.decode(result.getBytes(), Base64.DEFAULT); 
+6

Si bien este código puede responder a la pregunta, proporcionar un contexto adicional con respecto a por qué y/o cómo responde este código a la pregunta mejora su valor a largo plazo. –

3
// 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; 
} 
2

Si usted está haciendo esto en Android , aquí hay un ayudante copiado de React Native codebase:

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) { 
    } 
} 
+0

(asignará una cadena grande y puede causar un bloqueo OOM) Entonces, ¿cuál es la solución en este caso? –

-1

utilizar este código:

byte[ ] decodedString = Base64.decode(Base64String.getBytes(), Base64.DEFAULT); 

Bitmap decodedByte = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length); 
+0

Esto es todo lo contrario –

0

A continuación se presentan el pseudo código que puede ayudarle a:

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; 
    } 
Cuestiones relacionadas