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