Bitmap 图片的裁剪
有一个需求,把图片显示在一个宽高比为1.5 : 1的ImageView中,提供的图片宽和高都是不一定的,有宽大于高的,也有高大于宽的,这就需要对图片裁剪。该方法符合宽高比大于1的图片截取。
/**
* 根据控件比例剪裁bitmap成一个固定大小的图片
* @param bitmap 需要裁剪的源图
* @param num1 宽比例
* @param num2 高比例
* @param isRecycled 是否回收
* @return 裁剪之后的bitmap
*/
public static
Bitmap imageCrop(Bitmap bitmap,
float
num1,
float
num2,
boolean
isRecycled) {
if (bitmap == null ) {
return null ;
}
//得到bitmap的宽,高
int w=bitmap.getWidth();
int h = bitmap.getHeight();
int retX, retY;//裁剪的起始点
intnw, nh;//裁剪下来newBitmap的宽和高
if(w > h) {//宽大于高
if(h > w * num2 / num1) {//如果跟比例走的话,高符合条件,则保存宽度,截取高
nw = w;
nh =(int)(w * num2 / num1);
retX =0;
retY = (h - nh) /2;
}else{//如果高达不到比例要求的,则保持高截取宽
nw = (int)(h * num1 / num2);
nh = h;
retX = (w - nw) /2;
retY =0;
}
}else{//高大于宽,根据比例宽高比大于1,高肯定符合条件,所以直接截取
nw = w;
nh =(int)(w * num2 / num1);
retX =0;
retY = (h - nh) /2;
}
Bitmap bmp = Bitmap.createBitmap(bitmap, retX, retY, nw, nh,null,false);
if(isRecycled && bitmap !=null&& !bitmap.equals(bmp) && !bitmap.isRecycled()) {
bitmap.recycle();//回收原图片
bitmap =null;
}
returnbmp;
}
图片的截取,如果是图片宽大于高,接下来进一步判断,通过宽高的比例,判断出图片高(h)是否符合比例,
如果(h)符合条件,则宽度不变nw = w,截取宽nh =(int)(w * num2 / num1);如果(h)不符合宽高比例条件(如果h达不到比例之后的高度),则以h为准,截取宽
eg,宽高比为2:1
图片宽大于高的情况下:
图片20*18 18>20/2 高符合条件;图片 20*8 8<20/2 高不符合条件
图片高大于宽的情况下:
以宽为准,截取高。(宽高比必须大于1)
如果需要对图片进行缩放的话,裁剪好图片之后,再进行缩放。
截取图片之后,再进行缩放操作 。