Skia Decoder не может декодировать удаленный поток - PullRequest
7 голосов
/ 07 мая 2010

Я пытаюсь открыть удаленный поток изображения JPEG и преобразовать его в растровый объект:

    BitmapFactory.decodeStream(
new URL("http://some.url.to/source/image.jpg")
.openStream());

Декодер возвращает ноль, и в логах я получаю следующее сообщение:

DEBUG/skia(xxxx): --- decoder->decode returned false

Примечание:
1. длина содержимого не равна нулю, а тип содержимого image/jpeg
2. Когда я открываю URL в браузере, я вижу изображение.

Что мне здесь не хватает?

Пожалуйста, помогите. Спасибо.

Ответы [ 4 ]

10 голосов
/ 22 марта 2011

Решение, представленное в ошибке Android № 6066 , состоит в переопределении std FilterInputStream и последующей отправке его в BitmapFactory.

static class FlushedInputStream extends FilterInputStream {
    public FlushedInputStream(InputStream inputStream) {
    super(inputStream);
    }

    @Override
    public long skip(long n) throws IOException {
        long totalBytesSkipped = 0L;
        while (totalBytesSkipped < n) {
            long bytesSkipped = in.skip(n - totalBytesSkipped);
            if (bytesSkipped == 0L) {
                  int byteValue = read();
                  if (byteValue < 0) {
                      break;  // we reached EOF
                  } else {
                      bytesSkipped = 1; // we read one byte
                  }
           }
           totalBytesSkipped += bytesSkipped;
        }
        return totalBytesSkipped;
    }
}

и затем используйте функцию decodeStream:

Bitmap bitmap = BitmapFactory.decodeStream(new FlushedInputStream(inputStream));

Другое решение, которое я нашел, - просто передать BufferedInputStream для BitmapFactory:

Bitmap bitmap = BitmapFactory.decodeStream(new BufferedInputStream(inputStream));

Эти два решения должны помочь.

Дополнительную информацию можно найти в комментариях к отчету об ошибке: ошибка Android № 6066

3 голосов
/ 09 мая 2010

, кажется, была какая-то проблема с потоком и способом, которым Android справился с этим; патч в этом отчете об ошибке решил проблему на данный момент.

0 голосов
/ 01 сентября 2017

Я нашел библиотеку, которая может открывать изображения, на которых не работает Android SKIA. Это может быть полезно для определенных случаев использования:

https://github.com/suckgamony/RapidDecoder

Для меня это решило проблему, так как я загружаю не много изображений одновременно, и многие загружаемые изображения имеют профиль ICC. Я не пробовал интегрировать его с некоторыми распространенными библиотеками, такими как Picasso или Glide.

0 голосов
/ 10 декабря 2013

Для меня проблема с типом цвета изображения: ваше изображение в цвете = CYMK не в RGB

...