由于移动设备的屏幕尺寸有限,即使将高分辨率图片的分辨率降低,也不会影响显示效果。那如何降低呢?就需要用到一个类,那就是BitmapFactory.options类,主要会用到这个类的inSampleSize、inJustDecodeBounds、outHeight、outWidth参数。
inSampleSize:缩放比例,这个参数需要是2的幂函数。
inJustDecodeBounds:如果设置这个参数为ture,就不会给图片分配内存空间,但是可以获取到图片的大小等属性。
outHeight:图片高,单位像素.
outWidth:图片宽,单位像素.
inSampleSize:缩放比例,这个参数需要是2的幂函数。
inJustDecodeBounds:如果设置这个参数为ture,就不会给图片分配内存空间,但是可以获取到图片的大小等属性。
outHeight:图片高,单位像素.
outWidth:图片宽,单位像素.
说完这个类后,我们说说步骤,首先我们可以通过设置一个Options的属性inJustDecodeBounds=true,然后使用BitmapFactory.decodeXXX方法,让options作为参数,这样,我们在不分配内存的情况下,可以通过options读取图片的大小,outWidth和outHeight。其次通过原始图片的大小和你需要图片的大小来计算出需要缩放的比例。最后通过缩放比例值作为options.inSampleSize的值,再次调用BitmapFactory.decodeXXX,在调用方法前一定要设置inJustDecodeBounds=false
public class MainActivity extends AppCompatActivity { private final int MAXPICWITH = 1000; private final int MAXPICHEIGHT = 1000; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //ImageView imageView = (ImageView) findViewById(R.id.ivPic); ImageView imageViewSimple = (ImageView) findViewById(R.id.ivPic); //imageView.setImageResource(R.drawable.abc); //TODO 获取bitmap Bitmap bm = getBitMapFromRes(); //TODO 给imageview设置图片 imageViewSimple.setImageBitmap(bm); } /** * 获取图片,并进行压缩 * @return */ private Bitmap getBitMapFromRes() { int sampleSize = 1; BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeResource(getResources(),R.drawable.bigpic,options); int iWith = options.outWidth; int iHeight = options.outHeight; while ((iWith/sampleSize > MAXPICWITH) || (iHeight/sampleSize > MAXPICHEIGHT)){ sampleSize = sampleSize*2; } options.inJustDecodeBounds = false; options.inSampleSize = sampleSize; Bitmap bm = BitmapFactory.decodeResource(getResources(),R.drawable.bigpic,options); return bm; } }