2013-07-06 2 views
18

У меня есть изображение, отправленное мне через строку JSON. Я хочу преобразовать эту строку в изображение в моем приложении Android, а затем отобразить это изображение.Преобразование base64 в изображение в Java

Строка JSON выглядит следующим образом:

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

Примечания: Я усечена строка с ...

У меня есть функция, которая (я думаю), преобразующую строку в изображение , Правильно ли я это делаю?

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

Тогда я пытаюсь отобразить его на моем андроида деятельности как этот

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

Однако, когда я делаю это, ничего не отображается. У меня нет ошибок в logcat. Что я делаю не так?

Благодаря

ответ

43

Я беспокоюсь о том, что вам нужно декодировать только base64 строку, чтобы получить байты изображения, так что в строке

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

, вы должны получить данные после того, как data:image\/png;base64,, так что вы получите только изображение байт, а затем расшифровать их:

String imageDataBytes = completeImageData.substring(completeImageData.indexOf(",")+1); 

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

Это код, так что вы понимаете, как это работает, но если вы получаете объект JSON это должно быть сделано правильно путь:

  • Преобразование строки JSON в объект JSON.
  • Извлечь строку под data ключ.
  • Убедитесь, что начинается с image/png, так что вы знаете, это изображение png.
  • Убедитесь, что содержит строку base64, поэтому вы знаете, что данные должны быть декодированы.
  • Декодировать данные после строки base64, чтобы получить изображение.
+0

вы рок! спасибо за подстроку по индексу "," тоже ... эта часть была обязательной. – user952342

+0

Добро пожаловать;) –

+0

Правильно ... это сработало для меня .. –

3
InputStream stream = new ByteArrayInputStream(image.getBytes()); 

должен быть изменен на

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

См http://developer.android.com/reference/android/util/Base64.html подробную информацию о том, как сделать декодирование Base64.

Отказ от ответственности: я не проверял синтаксис, но так вы должны это делать.

+1

'image \/png; base64,' не нужно расшифровывать. –

+1

@Jorge, вместо того, чтобы сбрасывать, вы могли бы отредактировать мой ответ. Дело в том, что автор отсутствовал для выполнения декодирования базовой 64. –

+0

Спасибо Wand Maker! Ваше решение было наполовину правильным, но мне нужно было взять подстроку, а после «,». – user952342

1

Вот рабочий код, который преобразует кодированный входной поток Base64 и записывает его на диск. Я потратил немного времени, чтобы заставить его работать правильно. Поэтому я надеюсь, что это поможет другим разработчикам.

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); 
} 
Смежные вопросы