2015-12-28 1 views
0

КонтекстПреобразовать BufferedImage выход из Java в Bitmap в Android

Я считаю, что я искал достаточно об этой теме, но не нашел ответа. Если у кого-нибудь из вас есть ответ, пожалуйста, помогите.

  • Я пытаюсь отправить изображение в качестве выхода на вызов службы из android app.

  • Я использовал BufferedImage, ImageIO и ByteArrayOutputStream преобразовать изображение в Base64 encoded string (от многих примеров, которые я мог бы найти на StackOverflow).

  • Этот Base64 encoded string получен андроидным приложением. Теперь это нужно преобразовать обратно в изображение и показать в действии.

  • FYI. Изображение, которое я пытаюсь отправить, - это QR-код, созданный с использованием библиотек zxing.

Проблема

Это где я борюсь. Я не уверен, как это сделать. Я не размещал какой-либо пример кода, так как код на стороне сервера довольно понятен и у меня еще нет кода на стороне сервера.

Пример кода на Android стороне

private Bitmap getBitmap() { 
     String base64String="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"; 
     ByteArrayInputStream imageArr=new ByteArrayInputStream(Base64.decode(base64String, Base64.DEFAULT)); 
     Bitmap bitmap = BitmapFactory.decodeStream(imageArr); 
     return bitmap; 
    } 
+0

поэтому какая у вас проблема с 'Base64'? – pskink

+0

Нет проблем с базой64 как таковой. Проблема заключается в преобразовании BufferedImage с кодировкой base64 в изображение/растровое изображение на стороне android. – Ramesh

+0

поэтому 'BitmapFactory' не работает? – pskink

ответ

1

@haraldK, спасибо, что дал мне правильный указатель. Мне также было интересно, почему я не видел никаких дополнений, но не уделял этому достаточно внимания, чтобы понять эту проблему. Но, основываясь на вашем намеке, я, наконец, понял проблему. Проблема заключалась в том, что я не закрывал OutputStream, заданный Base64 Encoder, должным образом. В моем коде я имел поток Base64 кодер как обертку ByteArrayOutputStream, как показано ниже:

final ByteArrayOutputStream os = new ByteArrayOutputStream(); 
String qString = ""; 
try { 
    MatrixToImageWriter.writeToStream(matrix, formatName, Base64.getEncoder().wrap(os)); 
    qString = os.toString("UTF-8"); 
    os.close(); 

    return qString; 
} catch (final IOException ioe) { 
     throw new UncheckedIOException(ioe); 
} 

В приведенном выше коде, я закрывал ByteArrayOutputStream с помощью os.close(), который не требовалось. Но требовалось закрытие OutputStream, выдаваемое кодером Base64. Я изменил код, как показано ниже, чтобы сделать его работу:

final ByteArrayOutputStream os = new ByteArrayOutputStream(); 
    OutputStream base64Stream = Base64.getEncoder().wrap(os); 
    String qString = ""; 
    try { 
     MatrixToImageWriter.writeToStream(matrix, formatName, base64Stream); 
     base64Stream.close(); 
     qString = os.toString("UTF-8"); 
     os.close(); 

     return qString; 
    } catch (final IOException ioe) { 
     throw new UncheckedIOException(ioe); 
    } 

После вышеуказанного изменения в формате base64 строки правильно проложенный и правильно получать декодируется на Android стороне. На андроид стороне это код, который я должен отобразить изображение:

byte[] imageArr=Base64.decode(base64String.getBytes(), Base64.NO_WRAP); 
Bitmap bitmap=BitmapFactory.decodeByteArray(imageArr, 0, imageArr.length); 
return bitmap; 

я не знаю, как upvote своего ответа, так что я создал это как отдельный ответ. Спасибо за вашу помощь.

0

Можете ли вы добавить свой образ строки Ответ

Как вы делаете это в ByteArrayOutputStream вы можете пропустили ниже пункт перед декодированием

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

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

Bitmap bitmap = BitmapFactory.decodeStream(stream); 

Хороший ответ имеется по тому же вопросу here

+0

Я уже пробовал аналогичный код и, похоже, не работал. Я привел образец кода выше с строкой изображения с кодировкой base64. – Ramesh

+0

Используйте «InputStream» вместо «ByteArrayInputStream» и передайте его «BitmapFactory.decodeStream (InputStream is)», он не примет «ByteArrayInputStream», насколько мне известно, я обновил то же самое в своем ответе –

Смежные вопросы