Convierta la cadena base64 a Image en Java

Tengo una imagen que me es enviada a través de una cadena JSON. Quiero convertir esa cadena en una imagen en mi aplicación de Android y luego mostrar esa imagen.

La cadena JSON se ve así:

"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAVI..." 

Nota: trunqué la cadena con un …

Tengo una función que (creo) convierte la cadena en una imagen. ¿Lo estoy haciendo bien?

 public Bitmap ConvertToImage(String image){ try{ InputStream stream = new ByteArrayInputStream(image.getBytes()); Bitmap bitmap = BitmapFactory.decodeStream(stream); return bitmap; } catch (Exception e) { return null; } } 

Luego trato de mostrarlo en mi actividad de Android como este

 String image = jsonObject.getString("barcode_img"); Bitmap myBitmap = this.ConvertToImage(image); ImageView cimg = (ImageView)findViewById(R.id.imageView1); //Now try setting dynamic image cimg.setImageBitmap(myBitmap); 

Sin embargo, cuando hago esto, no aparece nada. No obtengo ningún error en el logcat. ¿Qué estoy haciendo mal?

Gracias

Me preocupa que necesites decodificar solo la cadena base64 para obtener los bytes de la imagen, así que en tu

 "data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAVI..." 

cadena, debe obtener los datos después de los data:image\/png;base64, modo que solo obtenga los bytes de la imagen y luego decodifíquelos:

 String imageDataBytes = completeImageData.substring(completeImageData.indexOf(",")+1); InputStream stream = new ByteArrayInputStream(Base64.decode(imageDataBytes.getBytes(), Base64.DEFAULT)); 

Este es un código para que comprenda cómo funciona, pero si recibe un objeto JSON, debe hacerlo de la manera correcta :

  • Convirtiendo la cadena JSON a un objeto JSON.
  • Extraiga la cadena debajo de data clave de data .
  • Asegúrate de que comience con image/png para que sepas que es una imagen png.
  • Asegúrese de que contiene cadena base64 , para que sepa que los datos deben decodificarse.
  • Decodifica los datos después de la cadena base64 para obtener la imagen.
 InputStream stream = new ByteArrayInputStream(image.getBytes()); 

debe cambiarse a

 InputStream stream = new ByteArrayInputStream(Base64.decode(image.getBytes(), Base64.DEFAULT)); 

Consulte http://developer.android.com/reference/android/util/Base64.html para obtener detalles sobre cómo realizar la deencoding Base64.

Descargo de responsabilidad: no he verificado la syntax, pero así es como debería hacerlo.

Aquí está el código de trabajo que convierte InputStream codificado en Base64 y lo escribe en el disco. Pasé un tiempo para que funcione correctamente. Así que espero que esto ayude a otros desarrolladores.

 public boolean writeImageToDisk(FileItem item, File imageFile) { // clear error message errorMessage = null; FileOutputStream out = null; boolean ret = false; try { // write thumbnail to output folder out = createOutputStream(imageFile); // Copy input stream to output stream byte[] headerBytes = new byte[22]; InputStream imageStream = item.getInputStream(); imageStream.read(headerBytes); String header = new String(headerBytes); // System.out.println(header); byte[] b = new byte[4 * 1024]; byte[] decoded; int read = 0; while ((read = imageStream.read(b)) != -1) { // System.out.println(); if (Base64.isArrayByteBase64(b)) { decoded = Base64.decodeBase64(b); out.write(decoded); } } ret = true; } catch (IOException e) { StringWriter sw = new StringWriter(); e.printStackTrace(new PrintWriter(sw)); errorMessage = "error: " + sw; } finally { if (out != null) { try { out.close(); } catch (Exception e) { StringWriter sw = new StringWriter(); e.printStackTrace(new PrintWriter(sw)); System.out.println("Cannot close outputStream after writing file to disk!" + sw.toString()); } } } return ret; } /** * Helper method for the creation of a file output stream. * * @param imageFolder * : folder where images are to be saved. * @param id * : id of spcefic image file. * @return FileOutputStream object prepared to store images. * @throws FileNotFoundException */ protected FileOutputStream createOutputStream(File imageFile) throws FileNotFoundException { imageFile.getParentFile().mkdirs(); return new FileOutputStream(imageFile); }