直接上代码 在代码中具体说明
<ImageView
android:id="@+id/image_view"
android:layout_width="100dp"
android:layout_height="100dp"
android:scaleType="centerCrop"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
// 布局代码
java 代码
private ImageView mImageView; //声明引用
private Bitmap mBitmap;//…
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mImageView = findViewById(R.id.image_view);
final BitmapFactory.Options options = new BitmapFactory.Options();
//初始化 options
options.inJustDecodeBounds = true;
//设置 仅仅获取宽高并不实际获取bitmap(这是一个轻量级操作)
BitmapFactory.decodeResource(getResources(), R.drawable.image , options);
//此时的options 中已经存在了 当前图片image 的宽度和高度
int reqWidth = 100 * 3;
int reqHeight = 100 * 3 ;
// 我的dp 设置 的是100 我的测试机是1080*1920 的 直接乘以3了,
options.inSampleSize = calculateInSamplesSize(options, reqWidth ,reqHeight);
// 获取压缩的大小
options.inJustDecodeBounds = false;
// 将仅获取边界设置为false 就可一个获取真正的bitmap 对象了
mBitmap = BitmapFactory.decodeResource(getResources() , R.drawable.image , options);
mImageView.setImageBitmap(mBitmap);
}
private int calculateInSamplesSize(BitmapFactory.Options options, int reqwith, int reqHeight ){
final int height = options.outHeight;
final int width = options.outWidth;
// 图片的宽度和高度
int inSamplesize = 1;
//初始的采样率设置为1
if(height > reqHeight || width >reqwith){
final int halfHeght = height/2 ;
final int halfwidth = width/2 ;
// 每次宽度高度除以2 获取预期宽度和高度进行和 上述的 宽度高度进行比较
while(halfHeght/inSamplesize >= reqHeight && (halfwidth/inSamplesize >= reqwith)){
inSamplesize *=2;
// 采样率要设为2 的指数 options.inSampleSize 方法源码中有这么一段话
/** decoder uses a final value based on powers of 2, any other value will
* be rounded down to the nearest power of 2.
* 意思就是说 通常用一个2 的指数 如果不是2 的指数 他会变成一个接近它的2 的指数来代替
*
*/
}
}
return inSamplesize;// 返回 采样率的大小
}
@Override
protected void onDestroy() {
super.onDestroy();
if(mBitmap != null && !mBitmap.isRecycled()){
mBitmap.recycle();
mBitmap = null;
// 销毁 bitmap
}
}
上述图片自备
这是一个很简单的例子,但是这个也是非常基础的东西,但是很多开发者用习惯了第三方 图片框架 有可能回忘记这个基础的东西。