Android 大图片的压缩

直接上代码 在代码中具体说明

<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
    }
}

上述图片自备

这是一个很简单的例子,但是这个也是非常基础的东西,但是很多开发者用习惯了第三方 图片框架 有可能回忘记这个基础的东西。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值