我不明白为什么我会收到这个 IO 异常。它说,在文档"Throws
IOException if the image format is not supported or can not be decoded."
和"he stream's position will be where ever it was after the encoded data was read. Currently only the JPEG and PNG formats are supported."
,我用给它一个PNG,我甚至输出的图像类型bitmapOptions.outMimeType;
和它说image/png
代码 :
@Override
protected List<String> doInBackground(String... urlo) {
List<String> savedKeys = new ArrayList<String>();
InputStream inputStream = null;
try {
URL url = new URL("https://upload.wikimedia.org/wikipedia/commons/thumb/4/47/PNG_transparency_demonstration_1.png/280px-PNG_transparency_demonstration_1.png");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoInput(true);
connection.connect();
inputStream = connection.getInputStream();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
BitmapFactory.Options bitmapOptions = new BitmapFactory.Options();
bitmapOptions.inJustDecodeBounds = true;
BitmapFactory.decodeStream(inputStream, null, bitmapOptions);
int width = bitmapOptions.outWidth;
int height = bitmapOptions.outHeight;
String imageType = bitmapOptions.outMimeType;
Debug.out(imageType);
int block = 256;
int count =0;
BitmapRegionDecoder decoder = null;
try {
decoder = BitmapRegionDecoder.
newInstance(inputStream, false);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Rect tileBounds = new Rect();
// loop blocks
for (int i=0; i<height; i+=block) {
// get vertical bounds limited by image height
tileBounds.top = i;
int h = i+block<height ? block : height-i;
tileBounds.bottom = i+h;
tileBounds.right = 0;
tileBounds.left = width;
Debug.out(tileBounds.left+" "+tileBounds.right+" "+tileBounds.top+tileBounds.bottom);
// load tile
tile = decoder.decodeRegion(tileBounds, bitmapOptions);
MainActivity.cache.put(key+count, tile);
publishProgress();
tile.recycle();
savedKeys.add(key+count);
}
try {
inputStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return savedKeys;
}
Run Code Online (Sandbox Code Playgroud)
抛出异常不是因为文件类型错误,而是因为文件不可读。
BitmapFactory.decodeStream(inputStream, null, bitmapOptions);
Run Code Online (Sandbox Code Playgroud)
这会“遍历”流,并且您的流对象不再从头开始。
解决方案是在此之后再次调用inputStream = connection.getInputStream();
,将流返回到其原始可读状态。
归档时间: |
|
查看次数: |
2366 次 |
最近记录: |