图片压缩

只为记录图片压缩的内容用,非原创

图片存在形式

位置 形式 测量大小
硬盘 file file.length()
网络传输 stream byte[].length
内存 stream或bitmap 如下getBitmapSize

**getBitmapSize **

    public static int getBitmapSize(Bitmap bitmap) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { // API 19
            return bitmap.getAllocationByteCount();
        }
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR1) {// API 12
            return bitmap.getByteCount();
        }
        return bitmap.getRowBytes() * bitmap.getHeight(); // earlier version
    }

两种压缩方式区别

压缩方式 说明 使用场景
质量压缩 不改变图片的尺寸,不会减少图片的像素,只对file有影响,再次加载bitmap内存变化不大 1.上传大图前的处理;2.图片保存到本地时;
尺寸压缩 减小了图片的像素,继而对bitmap产生影响 1.生成缩略图;2.将图片从本地读到内存时

略举4个压缩方法

    /*
     * 图片压缩的方法01:质量压缩
     */
    private Bitmap compressImage(Bitmap beforBitmap) {
        // 可以捕获内存缓冲区的数据,转换成字节数组。
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        if (beforBitmap != null) {
            // 第一个参数:图片压缩的格式;第二个参数:压缩的比率;第三个参数:压缩的数据存放到bos中
            beforBitmap.compress(CompressFormat.JPEG, 100, bos);
            int options = 100;
            // 循环判断压缩后的图片是否是大于100kb,如果大于,就继续压缩,否则就不压缩
            while (bos.toByteArray().length / 1024 > 100) {
                bos.reset();// 置为空
                // 压缩options%
                beforBitmap.compress(CompressFormat.JPEG, options, bos);
                // 每次都减少10
                options -= 10;
            }
            // 从bos中将数据读出来 存放到ByteArrayInputStream中
            ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
            // 将数据转换成图片
            Bitmap afterBitmap = BitmapFactory.decodeStream(bis);
            return afterBitmap;
        }
        return null;
    }

    /*
     * 图片压缩方法02--尺寸压缩-缩略图
     */
    public Bitmap getThumbnail(int id) {
        // 获得原图
        Bitmap beforeBitmap = BitmapFactory.decodeResource(mContext.getResources(), id);
        // 宽
        int w = mContext.getResources().getDimensionPixelOffset(R.dimen.image_w);
        // 高
        int h = mContext.getResources().getDimensionPixelSize(R.dimen.image_h);
        // 获得缩略图
        Bitmap afterBitmap = ThumbnailUtils.extractThumbnail(beforeBitmap, w, h);
        return afterBitmap;
    }

    /**
     * 图片压缩03-尺寸缩放
     * @param bmp  Bitmap
     * @param w 最终生成file的宽度
     * @param h 最终生成file的高度
     * @return
     */
    public Bitmap compressBitmap(Bitmap bmp, int w, int h) {
        return Bitmap.createScaledBitmap(bmp, w, h, true);
    }

    /**
     * 图片压缩04-尺寸压缩
     * @param id         资源文件id
     * @param newWidth  图片指定的宽度
     * @param newHeight 图片指定的高度
     * @return
     */
    public Bitmap compressBitmap(int id, double newWidth, double newHeight) {
        // 获得原图
        Bitmap beforeBitmap = BitmapFactory.decodeResource(mContext.getResources(), id);
        // 图片原有的宽度和高度
        float beforeWidth = beforeBitmap.getWidth();
        float beforeHeight = beforeBitmap.getHeight();
        // 计算宽高缩放率
        float scaleWidth = 0;
        float scaleHeight = 0;
        if (beforeWidth > beforeHeight) {
            scaleWidth = ((float) newWidth) / beforeWidth;
            scaleHeight = ((float) newHeight) / beforeHeight;
        } else {
            scaleWidth = ((float) newWidth) / beforeHeight;
            scaleHeight = ((float) newHeight) / beforeWidth;
        }
        // 矩阵对象
        Matrix matrix = new Matrix();
        // 缩放图片动作 缩放比例
        matrix.postScale(scaleWidth, scaleHeight);
        // 创建一个新的Bitmap 从原始图像剪切图像
        Bitmap afterBitmap = Bitmap.createBitmap(beforeBitmap, 0, 0,(int) beforeWidth, (int) beforeHeight, matrix, true);
        return afterBitmap;
    }

Bitmap转Byte

    public static byte[] Bitmap2Bytes(Bitmap bm){    
        ByteArrayOutputStream baos = new ByteArrayOutputStream();    
        bm.compress(Bitmap.CompressFormat.PNG, 100, baos);    
        return baos.toByteArray();    
    }    

byte[] 转 Bitmap

    public static Bitmap Bytes2Bimap(byte[] b) {  
        if (b.length != 0) {  
            return BitmapFactory.decodeByteArray(b, 0, b.length);  
        } else {  
            return null;  
        }  
    }

混合使用:优先尺寸压缩,然后质量压缩

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