图片按尺寸和质量压缩

最近项目中运用到了图片压缩,需求是要求上传的图片小于800k同时还需要大于500k,如此奇葩的需求,也是第一次遇见,
安卓中的图片压缩,一般存在两种情况,一种是尺寸压缩,另一种是质量压缩。
下面是对图片进行尺寸和质量压缩的方法:
/**
 * 根据路径加载bitmap  将缩放后的bitmap返回去
 *
 * @param path 路径
 * @param w     * @param h     * @return
 */
public static  Bitmap convertToBitmap(String path, int w, int h,int size) {
    try {//尺寸压缩
        BitmapFactory.Options opts = new BitmapFactory.Options();
        // 设置为ture只获取图片大小
        opts.inJustDecodeBounds = true;//只读边,不读内容  也就是不会真正返回一个bitmap,而是返回bitmap的宽高。
        opts.inPreferredConfig = Bitmap.Config.ARGB_8888;
        // 返回为空
        BitmapFactory.decodeFile(path, opts);//将path路径中的图片的宽、高等属性读到opts中,根据我们要求的宽高来判断原图片的宽高是否小于我们要求的图片的宽高,
       int width = opts.outWidth;
        int height = opts.outHeight;

        float scaleWidth = 0.f, scaleHeight = 0.f;
        if (width > w || height > h) {//如果宽度大于要求图片的宽度,或者高度大于要求图片的高度,将进行等比例压缩,此处需要注意的是,压缩后的图片尺寸,可能会远小于我们要求的图片尺寸,可以将if中的条件改为 
        //width > w && height > h
            // 缩放
scaleWidth = ((float) width) / w; scaleHeight = ((float) height) / h; } opts.inJustDecodeBounds = false; //缩放后的高度和宽度取最大值 float scale = Math.max(scaleWidth, scaleHeight); opts.inSampleSize = (int) scale;//此处是最后的宽高值 Bitmap bMapRotate = BitmapFactory.decodeFile(path, opts);//此处需调用BitmapFactory的方法才可以获取
        //opts属性的bitmap
System.out.println("bitmap-压缩前---" + bMapRotate.getRowBytes() * bMapRotate.getHeight()); ByteArrayOutputStream baos = new ByteArrayOutputStream();
//质量压缩
 bMapRotate.compress(Bitmap.CompressFormat.PNG, 100, baos);//质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中 int options = 100; while ( baos.toByteArray().length / 1024>size) { //循环判断如果压缩后图片是否大于 size kb,大于继续压缩
        baos.reset();//重置baos即清空baos 根据新的options 压缩率重新压缩,直到baos的大小小于我们要求的图片大小,跳出while循环,同时返回Bitmap

options -= 10;//每次都减少10 bMapRotate.compress(Bitmap.CompressFormat.JPEG, options, baos);//这里压缩options%,把压缩后的数据存放到baos中 这个baos的大小才是我们最终传到服务器的图片的大小 } ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());//把压缩后的数据baos存放到ByteArrayInputStream中 Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);//把ByteArrayInputStream数据生成图片 System.out.println("bitmap-压缩后---"+bitmap.getRowBytes()*bitmap.getHeight());//此处我们会发现,压缩前和压缩后bitmap的大小其实没有变化,原因是,我们用的质量压缩,但是bitmap所占的内存是不变的。 if (bitmap != null) { return bitmap; } return null; } catch (Exception e) { e.printStackTrace(); return null; }}

你可能感兴趣的:(图片按尺寸和质量压缩)