在解析图片时可能会遇到的OOM问题,通常我们可以通过BitmapFactory的decodeXXX方法解析出一张Bitmap,假如图片很小的话,不会有什么问题,但是图片很大的话,就可能会导致OOM问题,这个时候我们往往要通过BitmapFactory中的Options去压缩图片
既然是要压缩图片,压缩的比例是多大??
1.计算出屏幕的width,height
- WindowManager manager = (WindowManager)getSystemService(WINDOW_SERVICE);
Display display = manager.getDefaultDisplay();
Point outSize = new Point();
display.getSize(outSize);
x = outSize.x;
y = outSize.y; -
2.计算出图片的实际的width,height,必须要有opts.inJustDecodeBounds = true; 加上了这句代码,就只会返回图片的基本信息(比如图片的width,height等等)并不会返回实际的bitmap,也不会为了他去分配内存空间,所以就不会有OOM的问题
BitmapFactory.Options opts = new BitmapFactory.Options(); opts.inJustDecodeBounds = true; Bitmap bitmap = BitmapFactory.decodeFile(path,opts); int outWidth = opts.outWidth; int outHeight = opts.outHeight; -
3.设置默认的压缩比 scale == 1
当scale > 1时,比如scale==2时,BitmapFactory就会解析出一张原始图片的子样本,子样本的width和height都是原来的 1/2,也就是说子样本是原始图片的1/4
当scale <= 1时,可以吧scale设置为1
4.计算出适合的压缩比:
- int scale = 1;
int scaleX = outWidth / x;
int scaleY = outHeight / y;
if (scaleX > scaleY && scaleX > 1) {
scale = scaleX;
}
if (scaleX <= scaleY && scaleY > 1) {
scale = scaleY;
} -
5.设置缩放:
opts.inSampleSize = scale;
opts.inJustDecodeBounds = false;(必须要这句代码,才能返回一张bitmap)
Bitmap bitmap = BitmapFactory.decodeFile(path,opts);
就这样得到了一张缩略图,需要注意的是不管这里还是在前面获取图片基本信息的时候,如果路径错了,那么实际返回的bitmap位null
-
public class MainActivity extends AppCompatActivity {
String path = Environment.getExternalStorageDirectory() + "/dog.jpg";
BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inJustDecodeBounds = true;
BitmapFactory.decodeFile(path,opts);
int outWidth = opts.outWidth;
int outHeight = opts.outHeight;
int scale = 1;
int scaleX = outWidth / x;
int scaleY = outHeight / y;
if (scaleX > scaleY && scaleX > 1) {
scale = scaleX;
}if (scaleX <= scaleY && scaleY > 1) { scale = scaleY; } // 设置缩放 opts.inSampleSize = scale; opts.inJustDecodeBounds = false; Bitmap bitmap = BitmapFactory.decodeFile(path,opts); iv.setImageBitmap(bitmap);
网友评论