android 图片压缩

/**

* Decode and sample down a bitmap from a file to the requested width and

* height.

* @param filename

*            The full path of the file to decode

* @param reqWidth

*            The requested width of the resulting bitmap

* @param reqHeight

*            The requested height of the resulting bitmap

* @return A bitmap sampled down from the original with the same aspect

*         ratio and dimensions that are equal to or greater than the

*         requested width and height

*/

public static synchronized Bitmap decodeSampledBitmapFromFile(String filename, int reqWidth, int reqHeight) {


// First decode with inJustDecodeBounds=true to check dimensions

final BitmapFactory.Options options = new BitmapFactory.Options();

options.inJustDecodeBounds = true;

BitmapFactory.decodeFile(filename, options);


// Calculate inSampleSize

options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);


// Decode bitmap with inSampleSize set

options.inJustDecodeBounds = false;

return BitmapFactory.decodeFile(filename, options);

}


/**

* Calculate an inSampleSize for use in a {@link BitmapFactory.Options}

* object when decoding bitmaps using the decode* methods from

* {@link BitmapFactory}. This implementation calculates the closest

* inSampleSize that will result in the final decoded bitmap having a width

* and height equal to or larger than the requested width and height. This

* implementation does not ensure a power of 2 is returned for inSampleSize

* which can be faster when decoding but results in a larger bitmap which

* isn't as useful for caching purposes.

* @param options

*            An options object with out* params already populated (run

*            through a decode* method with inJustDecodeBounds==true

* @param reqWidth

*            The requested width of the resulting bitmap

* @param reqHeight

*            The requested height of the resulting bitmap

* @return The value to be used for inSampleSize

*/

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 (height > reqHeight || width > reqWidth) {

if (width > height) {

inSampleSize = Math.round((float) height / (float) reqHeight);

} else {

inSampleSize = Math.round((float) width / (float) reqWidth);

}


// This offers some additional logic in case the image has a strange

// aspect ratio. For example, a panorama may have a much larger

// width than height. In these cases the total pixels might still

// end up being too large to fit comfortably in memory, so we should

// be more aggressive with sample down the image (=larger

// inSampleSize).


final float totalPixels = width * height;


// Anything more than 2x the requested pixels we'll sample down

// further.

final float totalReqPixelsCap = reqWidth * reqHeight * 2;


while (totalPixels / (inSampleSize * inSampleSize) > totalReqPixelsCap) {

inSampleSize++;

}

}

return inSampleSize;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值