没错,我正在创建一个 Android 应用程序,我需要在其中显示来自某些 URL 的图像。不幸的是,图像太大了,当我将它传递给可绘制对象而不进行任何解码时,它会给我一个内存不足异常。
因此,我尝试首先使用 BitmapFactory.decodeStream 解码图像。
这是一些代码:
首先是我用来解码图像的方法:
public static Bitmap decodeSampledBitmapFromResource(Resources res, String src,
int reqWidth, int reqHeight) {
// First decode with inJustDecodeBounds=true to check dimensions
final BitmapFactory.Options options = new BitmapFactory.Options();
InputStream input = null;
InputStream input2 = null;
Rect paddingRect = new Rect(-1, -1, -1, -1);
try {
URL url = new URL(src);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoInput(true);
connection.connect();
input = connection.getInputStream();
//input2 = connection.getInputStream();
} catch (IOException e) {
e.printStackTrace();
return null;
}
options.inJustDecodeBounds = true;
BitmapFactory.decodeStream(input, paddingRect, options);
// Calculate inSampleSize
options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
try {
input.reset();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;
return BitmapFactory.decodeStream(input, paddingRect, options);
}
public static int calculateInSampleSize(
BitmapFactory.Options options, int reqWidth, int reqHeight) {
// Raw height and width of image
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 40;
if (height > reqHeight || width > reqWidth) {
if (width > height) {
inSampleSize = Math.round((float)height / (float)reqHeight);
} else {
inSampleSize = Math.round((float)width / (float)reqWidth);
}
}
return inSampleSize;
}
然后我在活动的 OnCreate 中调用该方法:
imageFrame1.setImageBitmap(
decodeSampledBitmapFromResource(getResources(), src, 100, 100));
就像现在的代码一样,当我在第一次解码后尝试重置输入流时,它会捕获一个 IOException,然后我收到 LogCat 消息:SKImageDecoder::Factory Returned Null。
如果我删除 input.reset(); 从代码中,我得到相同的 LogCat 消息,只是没有 IOException。
在这一点上有点难过,希望这里有人有一些建议吗?