对图片进行压缩

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

/** * 官方计算代码 * 根据用户所给出的宽度和高度计算出来压缩比例 * @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);

你可能感兴趣的:(压缩,图片)