Android中Bitmap的两种压缩方式

Android中Bitmap的两种压缩方式

质量压缩

public static Bitmap compressImage(Bitmap bitmap){  
        ByteArrayOutputStream baos = new ByteArrayOutputStream();  
        //质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中  
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);  
        int options = 100;  
        //循环判断如果压缩后图片是否大于50kb,大于继续压缩  
        while ( baos.toByteArray().length / 1024>50) {  
            //清空baos  
            baos.reset();  
            bitmap.compress(Bitmap.CompressFormat.JPEG, options, baos);  
            options -= 10;//每次都减少10  
        }  
        //把压缩后的数据baos存放到ByteArrayInputStream中  
        ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());  
        //把ByteArrayInputStream数据生成图片  
        Bitmap newBitmap = BitmapFactory.decodeStream(isBm, null, null);  
        return newBitmap;  
    }  

尺寸压缩

/**
 * 按图片尺寸压缩 参数是bitmap
 * @param bitmap
 * @param pixelW
 * @param pixelH
 * @return
 */
public static Bitmap compressImageFromBitmap(Bitmap bitmap, int pixelW, int pixelH) {
    ByteArrayOutputStream os = new ByteArrayOutputStream();
    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, os);
    if( os.toByteArray().length / 1024>512) {//判断如果图片大于0.5M,进行压缩避免在生成图片(BitmapFactory.decodeStream)时溢出
        os.reset();
        bitmap.compress(Bitmap.CompressFormat.JPEG, 50, os);//这里压缩50%,把压缩后的数据存放到baos中
    }
    ByteArrayInputStream is = new ByteArrayInputStream(os.toByteArray());
    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    options.inPreferredConfig = Bitmap.Config.RGB_565;
    BitmapFactory.decodeStream(is, null, options);
    options.inJustDecodeBounds = false;
    options.inSampleSize = computeSampleSize(options , pixelH > pixelW ? pixelW : pixelH ,pixelW * pixelH );
    is = new ByteArrayInputStream(os.toByteArray());
    Bitmap newBitmap = BitmapFactory.decodeStream(is, null, options);
    return newBitmap;
}


/**
 * 动态计算出图片的inSampleSize
 * @param options
 * @param minSideLength
 * @param maxNumOfPixels
 * @return
 */
public static int computeSampleSize(BitmapFactory.Options options, int minSideLength, int maxNumOfPixels) {
    int initialSize = computeInitialSampleSize(options, minSideLength, maxNumOfPixels);
    int roundedSize;
    if (initialSize <= 8) {
        roundedSize = 1;
        while (roundedSize < initialSize) {
            roundedSize <<= 1;
        }
    } else {
        roundedSize = (initialSize + 7) / 8 * 8;
    }
    return roundedSize;
}

private static int computeInitialSampleSize(BitmapFactory.Options options, int minSideLength, int maxNumOfPixels) {
    double w = options.outWidth;
    double h = options.outHeight;
    int lowerBound = (maxNumOfPixels == -1) ? 1 : (int) Math.ceil(Math.sqrt(w * h / maxNumOfPixels));
    int upperBound = (minSideLength == -1) ? 128 :(int) Math.min(Math.floor(w / minSideLength), Math.floor(h / minSideLength));
    if (upperBound < lowerBound) {
        return lowerBound;
    }
    if ((maxNumOfPixels == -1) && (minSideLength == -1)) {
        return 1;
    } else if (minSideLength == -1) {
        return lowerBound;
    } else {
        return upperBound;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值