Преобразование base64 в изображение в Java
У меня есть изображение, отправленное мне через строку JSON. Я хочу преобразовать эту строку в изображение в моем приложении Android, а затем отобразить это изображение.
Строка 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. Что я делаю неправильно?
Спасибо
Ответы
Ответ 1
Я беспокоюсь о том, что вам нужно декодировать только строку 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
, чтобы получить изображение.
Ответ 2
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.
Отказ от ответственности: я не проверял синтаксис, но так вы должны это делать.
Ответ 3
Вот рабочий код, который преобразует кодированный входной поток 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);
}