Android图片压缩

作者: Aron1001 | 来源:发表于2017-05-08 17:00 被阅读16次
    • 首先,需要注意的是图片在内存中的大小是根据分辨率来决定的,即height*width

    • BitmapFactory这个类提供了多个解析方法(decodeByteArray, decodeFile, decodeResource等)用于创建Bitmap对象,我们应该根据图片的来源选择合适的方法。比如SD卡中的图片可以使用decodeFile方法,网络上的图片可以使用decodeStream方法,资源文件中的图片可以使用decodeResource方法。

    等比例压缩

    不改变原来图片的宽和高,仅仅改变原图的大小,原图的内容也没有发生改变。代码如下:

     /* @param path 图片路径 
     * @param targetSize 缩放后期待的长边(图片长和宽大的那一个边)的长度 
     * @param targetW 期待的缩放后宽度 
     * @param targetH 期待的缩放后高度 
     * @return 
     */  
    public static Bitmap equalRatioScale(String path,int targetW,int targetH){  
        // 获取option  
        BitmapFactory.Options options = new BitmapFactory.Options();  
        // inJustDecodeBounds设置为true,这样使用该option decode出来的Bitmap是null,  
        // 只是把长宽存放到option中  
        options.inJustDecodeBounds = true;  
        // 此时bitmap为null  
        Bitmap bitmap = BitmapFactory.decodeFile(path, options);  
        int inSampleSize = 1; // 1是不缩放  
        // 计算宽高缩放比例  
        int inSampleSizeW = options.outWidth / targetW;  
        int inSampleSizeH = options.outHeight / targetH;  
        // 最终取大的那个为缩放比例,这样才能适配,例如宽缩放3倍才能适配屏幕,而  
        // 高不缩放就可以,那样的话如果按高缩放,宽在屏幕内就显示不下了  
        if (inSampleSizeW > inSampleSizeH) {   
            inSampleSize = inSampleSizeW;  
        }else {  
            inSampleSize = inSampleSizeH;  
        }  
        // 设置缩放比例  
        options.inSampleSize = inSampleSize;  
        // 一定要记得将inJustDecodeBounds设为false,否则Bitmap为null  
        options.inJustDecodeBounds = false;  
        bitmap = BitmapFactory.decodeFile(path, options);  
        return bitmap;  
    } 
    

    Matrix压缩

    这种方式主要是通过构建缩放矩阵和Bitmap.createBitmap方法来实现灵活缩放,宽和高缩放的比例可以不一致,而且通过Bitmap.createBitmap方法创建出来的是新的位图,这个位图可以是选取原图的一部分,而不是对原图进行整体缩放!类似于上传头像时,让你在原图上扣下来一块的效果,控制非常灵活。代码:

    /* @param path 原图路径 
     * @param offsetX 截取开始点在X轴偏移量 
     * @param offsetY 截取开始点在Y轴偏移量 
     * @param targetW 截取多宽(像素) 
     * @param targetH 截取多高(像素) 
     * @return 
     */  
    public static Bitmap matrixScale(String path,int offsetX,int offsetY,int targetW,int targetH){  
        // 构建原始位图  
        Bitmap bitmap = BitmapFactory.decodeFile(path);  
        // 获取原始宽高  
        int width = bitmap.getWidth();  
        int height = bitmap.getHeight();  
        // 计算宽高缩放比例,targetW,targetH即期待缩放完成后位图的宽高  
        float scaleW = (float)targetW / width;  
        float scaleH = (float)targetH / height;  
        // 将缩放比例放进矩阵  
        Matrix matrix = new Matrix();  
        matrix.postScale(scaleW, scaleH);  
        // 这个方法作用非常多,详细解释一下各个参数的意义!  
        // bitmap:原始位图  
        // 第二到第五个参数,即截取原图哪一部分构建新位图,  
        // offsetX和offsetY代表在X轴和Y轴上的像素偏移量,即从哪个位置开始截取  
        // width和height代表截取多少个像素,但是要注意,offsetX+width应该小于等于原图的宽度  
        // offsetY+height小于等于原图高度,要不然会报错,因为截到原图外面去了  
        // 像下面这样填写,就代表截取整个原图,  
        // Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, false);  
        // 如果填写100,100,200,200,就代表  
        // 从原图左上角往右和下各偏移100像素,然后往后和往下各截取200构建新位图  
        // matrix:缩放矩阵  
        // 最后一个参数表示如果矩阵里面还存放了过滤条件,是否按条件过滤(如果matrix里面只放了平移数据),最后一个参数设置成什么都不会生效  
        bitmap = Bitmap.createBitmap(bitmap, offsetX, offsetY, width, height, matrix, false);  
        return bitmap;  
    }  
    

    相关文章

      网友评论

        本文标题:Android图片压缩

        本文链接:https://www.haomeiwen.com/subject/vwamtxtx.html