背景
假设我有一个来自某个图像文件的 Internet 的 inputStream。
我希望获取有关图像文件的信息,然后才能对其进行解码。
它可用于多种用途,例如下采样以及在显示图像之前预览信息。
问题
我试图通过用 BufferedInputStream 包装 inputStream 来标记和重置 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 ......
编辑:
看来我的代码很好,有点......
在某些网站上(例如这个和这个),即使重置后也无法解码图像文件。
如果您解码位图(并使用 inSampleSize),它可以很好地解码(只需要很长时间)。
现在的问题是它为什么会发生,我该如何解决它。