Установить растровое изображение на ImageView - не удалось создать декодер изображения с сообщением «не реализовано» - PullRequest
0 голосов
/ 21 июня 2020

У меня есть Spring Api с двумя методами: один из них возвращает список как JSONArray, и другой метод, который возвращает byte [].

Когда я вызываю многостраничный запрос Volley для возврата байта [], я могу установить его в ImageView.

API

@GetMapping(value = "/return", produces = MediaType.IMAGE_JPEG_VALUE)
    public @ResponseBody byte[] getImage() throws IOException {     
        File myFile = new File(xxxxxxxxxxxxxxxxxxxxxxx);
        InputStream input = new FileInputStream(myFile);
        System.out.println(input);      
        return IOUtils.toByteArray(input);    
    }

APP

    public void returnImage(final ImageView im) {

        RequestQueue requestQueue = Volley.newRequestQueue(this);

        BinaryRequest binaryRequest = new BinaryRequest(0, getString(R.string._url),
            new Response.Listener<byte[]>() {
                @Override
                public void onResponse(byte[] response) {

                    im.setImageBitmap(BitmapFactory.decodeByteArray(response, 0, response.length));

                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                }
            }
        );
        requestQueue.add(binaryRequest);
    }

Когда я вызываю JSONArrayRequest, я не могу получить String, преобразовать в байт и установить ImageView.

Код API в основном тот же, но с другим возвратом.

Пример возврата:

[
    {
        "images": [],
        "JSON": {
            "XX":XX,
            "XX":XX,
            "XX":XX,
            "XX":XX,
            "XX":XX,
            "XX":XX,
            "XX":XX,
            "XX":XX,
        }
    }
]

APP

JSONArray jsa = jsonArrayResponse.getJSONObject(i).getJSONArray("images");

if(jsa != null){

    for (int nbr = 0; nbr < jsa.length(); nbr++) {

        byte[] bytes = jsa.get(nbr).toString().getBytes();

        ivPhoto.setImageBitmap(BitmapFactory.decodeByteArray(bytes, 0, bytes.length));

        return;

    }

}

(я получаю только одно изображение на данный момент).

Я получил возврат String и поставил https://codebeautify.org/base64-to-image-converter. Изображение отображается правильно.

1 Ответ

0 голосов
/ 21 июня 2020

Как я понял вы получаете изображения в формате Base64. Любые символы могут быть представлены байтами, но это не значит, что вы можете считать их изображением. И что в основном происходит, так это то, что вы пытаетесь создать изображение из закодированного в формате Base64, а BitmapFactory.decodeByteArray принимает

@ param массив байтов данных сжатых данных изображения

Перед декодированием байтов в изображение необходимо выполнить декодирование из Base64 в байты.

byte[] decodedImageBytes = Base64.decode(encodedImage, Base64.DEFAULT);
Bitmap bitmap = BitmapFactory.decodeByteArray(decodedImageBytes, 0, decodedImageBytes.length);
...