Android自定義相機、預覽區(qū)域裁剪
更新時間:2022年05月19日 17:16:02 作者:唐諾
這篇文章主要為大家詳細介紹了Android自定義相機、預覽區(qū)域裁剪,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
本文實例為大家分享了Android自定義相機,預覽區(qū)域裁剪的具體代碼,供大家參考,具體內容如下
寫法一:
預覽區(qū)域裁剪,方法調用:
//按照比例進行裁剪頭像區(qū)域 Bitmap ? resultBitmap = 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); ? ? }
其他方法:
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, List<Camera.Size> sizeList) { ? ? ? ? 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
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
android底部彈出iOS7風格對話選項框(QQ對話框)--第三方開源之IOS_Dialog_Library
這篇文章主要介紹了android底部彈出iOS7風格對話選項框(QQ對話框)--第三方開源--IOS_Dialog_Library的相關資料,需要的朋友可以參考下2015-11-11基于Manifest.xml中不要出現重復的uses permission的說明
本篇文章對Manifest.xml中不要出現重復的uses permission進行了介紹。需要的朋友參考下2013-05-05