Android自定义相机、预览区域裁剪
本文实例为大家分享了Android自定义相机,预览区域裁剪的具体代码,供大家参考,具体内容如下
写法一:
文章图片
预览区域裁剪,方法调用:
//按照比例进行裁剪头像区域BitmapresultBitmap = getScaleImage(resultBitmap, (int) cuttingAreaView.getX(),(int) cuttingAreaView.getY(), cuttingAreaView.getWidth(), cuttingAreaView.getHeight(), mSurfaceView.getWidth(), mSurfaceView.getHeight());
/*** 按照比例裁剪图片** @param source* @param cuttingAreaX预览view的X坐标* @param cuttingAreaY* @param cuttingAreaWidth* @param cuttingAreaHeight* @param displayWidth* @param displayHeight* @return*/private Bitmap getScaleImage(Bitmap source, int cuttingAreaX, int cuttingAreaY, int cuttingAreaWidth, int cuttingAreaHeight, int displayWidth, int displayHeight) {int sourceWidth = source.getWidth(); int sourceHeight = source.getHeight(); LegoLog.d("sourceWidth:" + sourceWidth + ",sourceHeight:" + sourceHeight + ",cuttingAreaX:" + cuttingAreaX + ",cuttingAreaY:" + cuttingAreaY + ",cuttingAreaWidth:" + cuttingAreaWidth + ",cuttingAreaHeight:" + cuttingAreaHeight + ",displayWidth:" + displayWidth + ",displayHeight:" + displayHeight); int sourceCuttingAreaX = cuttingAreaX * sourceWidth / displayWidth; int sourceCuttingAreaY = cuttingAreaY * sourceHeight / displayHeight; int sourceCuttingAreaWidth = cuttingAreaWidth * sourceWidth / displayWidth; int sourceCuttingAreaHeight = cuttingAreaHeight * sourceHeight / displayHeight; LegoLog.d("sourceWidth:" + sourceWidth + ",sourceHeight:" + sourceHeight + ",sourceCuttingAreaX:" + sourceCuttingAreaX + ",sourceCuttingAreaY:" + sourceCuttingAreaY + ",sourceCuttingAreaWidth:" + sourceCuttingAreaWidth + ",sourceCuttingAreaHeight:" + sourceCuttingAreaHeight); return Bitmap.createBitmap(source, sourceCuttingAreaX, sourceCuttingAreaY, sourceCuttingAreaWidth, sourceCuttingAreaHeight, null, false); }
【Android自定义相机、预览区域裁剪】其他方法:
private void initParameters(Camera camera) {try {mParameters = camera.getParameters(); mParameters.setPreviewFormat(ImageFormat.NV21); //获取与指定宽高相等或最接近的尺寸//设置预览尺寸Camera.Size bestPreviewSize = getBestSize(mSurfaceView.getWidth(), mSurfaceView.getHeight(), mParameters.getSupportedPreviewSizes()); if (bestPreviewSize != null) {mParameters.setPreviewSize(bestPreviewSize.width, bestPreviewSize.height); }//设置保存图片尺寸Camera.Size bestPicSize = getBestSize(PIC_WIDTH, PIC_HEIGHT, mParameters.getSupportedPictureSizes()); if (bestPicSize != null) {mParameters.setPictureSize(bestPicSize.width, bestPicSize.height); }//对焦模式if (isSupportFocus(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE)) {mParameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE); }camera.setParameters(mParameters); } catch (Exception e) {e.printStackTrace(); }}private Camera.Size getBestSize(int targetWidth, int targetHeight, ListsizeList) {Camera.Size bestSize = null; float targetRatio = ((float) targetHeight / targetWidth); //目标大小的宽高比float minDiff = targetRatio; for (Camera.Size size : sizeList) {if (size.width == targetHeight && size.height == targetWidth) {bestSize = size; break; }float supportedRatio = (float) size.width / size.height; if (Math.abs(supportedRatio - targetRatio) < minDiff) {minDiff = Math.abs(supportedRatio - targetRatio); bestSize = size; }}return bestSize; }
参考【人车核验】CaptureManager.java
写法二:
Bitmap bitmap = BitmapFactory.decodeFile(originalFile.getPath()); //原图//计算裁剪位置float left, top, right, bottom; left = (float) scanView.getLeft() / (float) cameraPreview.getWidth(); top = ((float) containerView.getTop() - (float) cameraPreview.getTop()) / (float) cameraPreview.getHeight(); right = (float) scanView.getRight() / (float) cameraPreview.getWidth(); bottom = (float) containerView.getBottom() / (float) cameraPreview.getHeight(); //裁剪及保存到文件Bitmap cropBitmap = Bitmap.createBitmap(bitmap,(int) (left * (float) bitmap.getWidth()),(int) (top * (float) bitmap.getHeight()),(int) ((right - left) * (float) bitmap.getWidth()),(int) ((bottom - top) * (float) bitmap.getHeight()));
参考:MobileCheck
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
推荐阅读
- 防止来自Facebook Android SDK的网络请求
- React Native Overflow Touchable在Android中不起作用
- 具有真实电话号码的Firebase PhoneAuth不工作但白名单号正在运行 - Android
- Firebase的新Firestore DB对电子商务Android应用程序来说更贵吗()
- 通过bash脚本获取Android Studio项目的构建文件夹路径
- AngularJS教程(自定义指令的神秘化)
- Android中的Firebase数据描述排序
- 调用getText()不在Android应用程序中编译
- 来自Postman的回复显示200,但Android返回403
- Android Google登录失败com.google.android.gms.common.api.ApiException(12500)