BitmapFactory.decodeStream (inputStream) всегда возвращает ноль, если некоторые байты неверны - PullRequest
3 голосов
/ 30 августа 2010

Я создаю приложение для Android, и в настоящее время у меня возникают проблемы с извлечением растрового изображения из URL. Вот код, который я использую:

public static Bitmap bmpFromURL(URL imageURL){

    Bitmap result = null;

    try {

        HttpURLConnection connection = (HttpURLConnection)imageURL .openConnection();

        connection.setDoInput(true);

        connection.connect();

        InputStream input = connection.getInputStream();

        result = BitmapFactory.decodeStream(input);


    } catch (IOException e) {


        e.printStackTrace();

    }

    return result;

}

Все отлично работает, когда запись изображения, но когда некоторые байты ошибочны, результат становится нулевым. Я думаю, что это в основном ожидаемо, так как написано в документе BitmapFactory.decodeStream:

Если входной поток имеет значение null или не может использоваться для декодирования растрового изображения, функция возвращает значение null. Положение потока будет таким, каким оно было после считывания закодированных данных.

Проблема в том, что мой неправильный рисунок хорошо интерпретируется моим веб-браузером, и я могу сделать это на платформе iPhone.

Есть ли способ игнорировать неправильные пиксели? может быть с параметром option?

Любая помощь приветствуется

Ромен

Ответы [ 2 ]

5 голосов
/ 30 августа 2010

Это известная ошибка, исправленная в будущей версии Android.Вы можете обойти это, сначала скопировав содержимое InputStream в массив byte [], а затем расшифровав сам массив байтов.

1 голос
/ 04 февраля 2011

Попробуйте это ... Это сработало для меня.надеюсь, это поможет.

result = BitmapFactory.decodeStream(new PatchInputStream(input));

public class PatchInputStream extends FilterInputStream {
   public PatchInputStream(InputStream input) {
       super(input);
   }
   public long skip(long n) throws IOException {
       long m = 0L;
       while (m < n) {
           long _m = in.skip(n-m);
           if (_m == 0L) break;
           m += _m;
       }
       return m;
   }
}
...