【发布时间】:2015-07-11 09:35:49
【问题描述】:
我在可绘制文件夹中有一个高分辨率图像 (2588*1603)。如果我使用下面的代码 (1) 为 imageView 设置它,我不会得到 OOM 异常并且图像按预期分配:
public class MainActivity extends ActionBarActivity{
private ImageView mImageView;
int mImageHeight = 0;
int mImageWidth = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mImageView = (ImageView) findViewById(R.id.imageView);
mImageView.setScaleType(ScaleType.FIT_CENTER);
BitmapFactory.Options sizeOption = new BitmapFactory.Options();
sizeOption.inJustDecodeBounds = true;
BitmapFactory.decodeResource(getResources(), R.drawable.a, sizeOption);
mImageHeight = sizeOption.outHeight;
mImageWidth = sizeOption.outWidth;
mImageView.post(new Runnable() {
@Override
public void run() {
try {
BitmapRegionDecoder bmpDecoder = BitmapRegionDecoder
.newInstance(getResources().openRawResource(R.drawable.a),true);
Rect rect = new Rect(0,0,mImageWidth, mImageHeight);
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
options.inDensity = getResources().getDisplayMetrics().densityDpi;
Bitmap bmp = bmpDecoder.decodeRegion(rect, options);
mImageView.setImageBitmap(bmp);
} catch (NotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
}
请注意,矩形大小与图像大小完全相同。
但如果我使用其他方法,例如 2 或 3,我会得到 OOM。
2) mImageView.setBackgroundResource(R.drawable.a);
3) Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.a);
mImageView.setImageBitmap(bmp);
1和2,3有什么区别?
(我知道怎么解决OOM,我只想知道区别)
【问题讨论】:
-
最终输出是什么?您是否看到整个位图,或者只是其中的一部分。我的假设是,如果矩形超出屏幕的大小,decodeRegion 会裁剪位图
-
@Blackbelt 是的,我将整个位图视为
ScaleType.FIT_CENTER与普通的Bitmap剂量。 -
那么可能
decodeRegion忽略了屏幕的密度 -
@Blackbelt 我将它设置为
options.inDensity = getResources().getDisplayMetrics().densityDpi;,如果它忽略会发生什么。我没有看到与设备密度有任何联系,位图内存大小由配置选项Bitmap.Config.ARGB_8888决定 -
我知道。我的想法是关于堆大小随着时间而增加的事实,并且在立即执行此代码时与在将 Runnable 添加到队列时的一段时间内,您有不同的(在您的情况下有多大不同是另一个问题,也许它无关紧要)堆大小。
标签: android bitmap out-of-memory android-drawable bitmapregiondecoder