BitmapFactory.Options中有属性:
inTargetDensity——Bitmap最终的像素密度
但是测试发现inTargetDensity即使设置成480也没起作用。
/**
* 使用inSampleSize、inScaled、inDensity、inTargetDensity对图片进行缩放
* <p>
* targetDensity使用屏幕的dpi密度,如480
*
* @param context
* @param imageView 缩放后的图片显示
*/
public static void resizeBitmap(Context context, ImageView imageView) {
try {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeStream(context.getResources().getAssets().open("timg.jpg"), null, options);
int targetDensity = context.getResources().getDisplayMetrics().densityDpi; //华为nova 2 plus 手机测试为480
DisplayMetrics dm = new DisplayMetrics();
((AppCompatActivity) context).getWindowManager().getDefaultDisplay().getMetrics(dm);
int x = dm.widthPixels;
int y = dm.heightPixels;
options.inSampleSize = calculateInSampleSize(options, x, y);
double xSScale = ((double) options.outWidth) / ((double) x);
double ySScale = ((double) options.outHeight) / ((double) y);
double startScale = xSScale > ySScale ? xSScale : ySScale;
options.inScaled = true;
options.inDensity = (int) (targetDensity * startScale);
options.inTargetDensity = targetDensity;
options.inJustDecodeBounds = false;
Bitmap bitmap = BitmapFactory.decodeStream(context.getAssets().open("timg.jpg"), null, options);
PictureUtils.saveImageToGallery(context, bitmap);
imageView.setImageBitmap(bitmap);
} catch (IOException e) {
e.printStackTrace();
Log.e(TAG, e.getMessage());
}
}
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) {
final int halfHeight = height / 2;
final int halfWidth = width / 2;
// Calculate the largest inSampleSize value that is a power of 2 and
// keeps both
// height and width larger than the requested height and width.
while ((halfHeight / inSampleSize) > reqHeight
&& (halfWidth / inSampleSize) > reqWidth) {
inSampleSize *= 2;
}
}
return inSampleSize;
}