バックグラウンド
特定の画像ファイルのインターネットから発信されたinputStreamがあるとします。
画像ファイルに関する情報を取得してから、それをデコードしたいと考えています。
ダウンサンプリングや、画像が表示される前の情報のプレビューなど、複数の目的に役立ちます。
問題
inputStream を BufferedInputStream でラップして、inputStream をマーク&リセットしようとしましたが、うまくいきませんでした:
inputStream=new BufferedInputStream(inputStream);
inputStream.mark(Integer.MAX_VALUE);
final BitmapFactory.Options options=new BitmapFactory.Options();
options.inJustDecodeBounds=true;
BitmapFactory.decodeStream(inputStream,null,options);
//this works fine. i get the options filled just right.
inputStream.reset();
final Bitmap bitmap=BitmapFactory.decodeStream(inputStream,null,options);
//this returns null
URLからinputStreamを取得するには、次を使用します。
public static InputStream getInputStreamFromInternet(final String urlString)
{
try
{
final URL url=new URL(urlString);
final HttpURLConnection urlConnection=(HttpURLConnection)url.openConnection();
final InputStream in=urlConnection.getInputStream();
return in;
}
catch(final Exception e)
{
e.printStackTrace();
}
return null;
}
質問
コードがリセットのマーキングを処理するようにするにはどうすればよいですか?
リソースでは完全に機能します(実際、これが機能するために新しいBufferedInputStreamを作成する必要さえありませんでした)が、インターネットからのinputStreamでは機能しません...
編集:
私のコードは問題ないようです...
一部の Web サイト (このサイトやこのサイトなど) では、リセットしても画像ファイルのデコードに失敗します。
ビットマップをデコードする (そして inSampleSize を使用する) 場合、問題なくデコードできます (時間がかかります)。
問題は、なぜそれが起こるのか、どうすれば修正できるのかということです。