在安卓开发中,如果对拍照后的图片进行图片裁剪,如果是调用系统的裁剪,如下:

/*

* 裁剪图片

*/

private void cropPhoto() {

Intent intent = new Intent("com.android.camera.action.CROP");

Uri uri = Uri.parse("file://" + picSavePath);

intent.setDataAndType(uri, "image/*");

intent.putExtra("crop", "true");

// intent.putExtra("aspectX", 3);

// intent.putExtra("aspectY", 2);

intent.putExtra("outputX", cropX);

intent.putExtra("outputY", cropY);

intent.putExtra("scale", "true");

intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);

intent.putExtra("return-data", "false");

intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());

intent.putExtra("noFaceDetection", "true"); // no face detection

startActivityForResult(intent, CROP_PICTURE);

}

这样,就开始对图片进行裁剪了,但是这样会有一个问题,当裁剪框选择的图片与录入的cropX,xropY的形状不同时,比如传入的参数值是个w>h的长方形,而选择框选择的是w

为了解决压缩变形的问题,我的思路是这样的:

1,先对图片进行裁剪,不设置默认的裁剪图片尺寸。

2.对裁剪后的图片再进行图片的缩放。缩放是采角的矩阵的方式进行的缩放

代码如下:

1.

/*

* 裁剪图片,

*/

private void cropPhotoAndZoom() {

Intent intent = new Intent("com.android.camera.action.CROP");

Uri uri = Uri.parse("file://" + picSavePath);

intent.setDataAndType(uri, "image/*");

intent.putExtra("crop", "true");

intent.putExtra("scale", "true");

intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);

intent.putExtra("return-data", "false");

intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());

intent.putExtra("noFaceDetection", "true"); // no face detection

startActivityForResult(intent, CROP_PICTURE_ANDZOOM);

}

2.

/**

* 裁剪后,根据裁剪框的长宽比,同时根据图片的需求缩放尺寸进行缩放

*

* @param path

* @param x

* 原始的需求尺寸width

* @param y

* heiht

* @return

*/

public static Bitmap toBigZoom(String path, float x, float y) {

Log.e("bitmaputil", "path---" + path + "--x--y--" + x + "--" + y);

Bitmap bitmap = BitmapFactory.decodeFile(path);

if (bitmap != null) {

int w = bitmap.getWidth();

int h = bitmap.getHeight();

float sx = 0;

float sy = 0;

if ((float) w / h >= 1) {

sx = (float) y / w;

sy = (float) x / h;

Log.e("bitmaputil---", "w/h--->=1");

} else {

sx = (float) x / w;

sy = (float) y / h;

Log.e("bitmaputil---", "w/h---<1");

}

Matrix matrix = new Matrix();

matrix.postScale(sx, sy); // 长和宽放大缩小的比例

Bitmap resizeBmp = Bitmap.createBitmap(bitmap, 0, 0, w, h, matrix, true);

Log.e("bitmaputil---", "w---" + resizeBmp.getWidth() + "h--" + resizeBmp.getHeight());

return resizeBmp;

}

return null;

}

2中代码,通过判断裁剪框的w,h比来设置图片是放大是横向放大,还是竖向放大,放大后的效果基本上能满足需求。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐