android 图片压缩

来源:互联网 发布:pscs3软件百度云 编辑:程序博客网 时间:2024/06/08 08:47

/**

* 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 staticsynchronized 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 staticint 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, apanorama 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).


finalfloat totalPixels = width * height;


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

// further.

finalfloat totalReqPixelsCap = reqWidth * reqHeight * 2;


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

inSampleSize++;

}

}

return inSampleSize;

}

0 0
原创粉丝点击