当我们加载一张大的图片的时候,很容易产生oom,这个时候对于大的位图要进行简单的预处理,进行一定程度的压缩,再进行使用,能让图片占用的内存变少,我们写一个简单的例子:
我们在xml中放入一个按钮,一个imageview,drawable文件中加入一张大位图。
<pre name="code" class="java">public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button btn;
private ImageView imageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn = (Button) findViewById(R.id.btn1);
imageView = (ImageView) findViewById(R.id.iv);
btn.setOnClickListener(this);
}
//这个函数拿来获得一个压缩过的位图,传入四个参数一个是资源,一个是资源的ID,一个是需要压缩成多宽,多高。
public Bitmap decodeResource(Resources res,int res_id,int reqWidth,int reqHeight)
{
BitmapFactory.Options options = new BitmapFactory.Options();
//设置为true是不加载具体图像只获得图片的宽高
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(res,res_id,options);
//调用计算压缩比的函数
options.inSampleSize = caculater(options,reqWidth,reqHeight);
//设置为false加载整个图片
options.inJustDecodeBounds = false;
//返回按压缩比压缩后的bitmap图像
return BitmapFactory.decodeResource(res,res_id,options);
}
//计算压缩比的函数
private static int caculater(BitmapFactory.Options options,int reqWidth, int reqHeight) {
//得到原图片的属性
int height = options.outHeight;
int width = options.outWidth;
//设置初始压缩比为1,也就是不压缩。
int sampleSize = options.inSampleSize = 1;
//如果需要的图片比原本的图片小,计算压缩比,按长和宽中较小值压缩,可以保证图片不失真。
if(height>reqHeight || width>reqWidth)
{
if(height>width)
{
sampleSize = Math.round((float)width/(float)reqWidth);
}
else {
sampleSize = Math.round((float)height/(float)reqWidth);
}
}
return sampleSize;
}
@Override
public void onClick(View view) {
Bitmap bitmap = decodeResource(getResources(),R.mipmap.spring,50,50);
imageView.setImageBitmap(bitmap);
}
}