对图片进行压缩

本文探讨了如何在二次采样过程中计算图片压缩后的尺寸,详细解析了图片压缩的原理与实践方法。
摘要由CSDN通过智能技术生成

对图片进行二次采样的时候计算压缩之后的尺寸

/**
     * 官方计算代码
     * 根据用户所给出的宽度和高度计算出来压缩比例
     * @param options
     * @param reqWidth
     * @param reqHeight
     * @return
     */

    public static int calculateInSampleSize(
         BitmapFactory.Options options, int reqWidth, int reqHeight) {
        // Raw height and width of image
        final int height = options.outHeight;
        final int width = options.outWidth;
        int inSampleSize = 1;

        //当请求的宽度高度大域名的时候进行缩放
        if (reqWidth > 0 && reqHeight > 0) {
            if (height > reqHeight || width > reqWidth) {

                final int halfHeight = height / 2;
                final int halfWidth = width / 2;

                // Calculate the largest inSampleSize value that is a power of 2 and keeps both
                // height and width larger than the requested height and width.
                while ((halfHeight / inSampleSize) > reqHeight
                        && (halfWidth / inSampleSize) > reqWidth) {
                    inSampleSize *= 2;
                }
            }
        }

        return inSampleSize;
    }



生成图片:
                      //按照原始的图片的尺寸 进行Bitmap的生成
                    //bitmap生成的时候是按照图片的原始的宽高进行生成,并且每一个像素占用四个字节也就是ARGB
                    //ret = BitmapFactory.decodeByteArray(data,0,data.length);
                    //采用二次采样也就是缩小图片尺寸的方法
                    //步骤1:获取原始图片的宽、高的信息只用于采样的计算
                    //1.1: 创建Options给BitMapFactiry内部解码器传递参数
                    BitmapFactory.Options options = new BitmapFactory.Options();
                    //1.2设置inJuetDecodeBounds 来控制解码器。只进行图片高度和宽度的获取不会加载Bitmap
                    //不占用内存,当时用这个参数,代表BitmapFactory.decodeXxx类似的方法,不会返回Bitmap
                    options.inJustDecodeBounds = true;
                    //解码的时候使用Options参数设置解码的方式
                    BitmapFactory.decodeByteArray(data, 0, data.length, options);
                    //--------------------------------------------------------------------------------
                    //2:根据图片的真实的尺寸,和当前需要显示的尺寸,进行计算,生成图片的采样率。
                    //2.2 准备显示在手机上的尺寸
                    //尺寸是根据程序需要设置的。
                    int size = calculateInSampleSize(options, requestWidth, requestHeight);
                    //2.3 计算和设置采样率
                    options.inSampleSize = size;//宽度的1/32 高度的1/32
                    //2.4开放 解码,实际生成Bitmap
                    options.inJustDecodeBounds = false;
                    //2.4.1
                    //要求对每一个采样的像素使用RGB_565存储方式
                    //一个像素占用两个字节比 ARGB_8888小了一半
                    //如果解码器不能使用指定的配置那么自动使用 ARGB_8888
                    options.inPreferredConfig = Bitmap.Config.RGB_565;

                    //2.5使用设置的采样参数进行解码
                    ret = BitmapFactory.decodeByteArray(data, 0, data.length, options);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值