Подтвердить что ты не робот

Преобразование 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. Что я делаю неправильно?

Спасибо

4b9b3361

Ответ 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);
}