From aea8a6e6d57659829fa62b74d727e049d06efcd5 Mon Sep 17 00:00:00 2001 From: zhouzhuo810 <244570672@qq.com> Date: Thu, 21 Apr 2022 20:40:54 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=95=BF=E5=B1=8F=E6=89=8B?= =?UTF-8?q?=E6=9C=BA=E9=A2=84=E8=A7=88=E5=8F=98=E5=BD=A2=E9=97=AE=E9=A2=98?= =?UTF-8?q?;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + .../cameracardcropdemo/MainActivity.java | 8 +++---- camera-card-crop/build.gradle | 4 ++-- .../cameracardcrop/BitmapUtils.java | 24 ++++++++++++------- .../cameracardcrop/CameraView.java | 12 ++++++---- .../zhouzhuo810/cameracardcrop/RectView.java | 2 +- 6 files changed, 31 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index 053a35e..852bb36 100644 --- a/README.md +++ b/README.md @@ -129,6 +129,7 @@ if CameraConfig.RATIO_WIDTH >= CameraConfig.RATIO_HEIGHT { ## Log +- 1.0.8 修复长屏手机预览变形问题; - 1.0.7 支持横屏模式;修复若干bug; - 1.0.6 将权限声明放到库里面,免得开发者忘记加. 新增`CameraConfig.NEED_WRITE_STORAGE_PERMISSION`配置项,默认false,用于控制是否申请写存储权限,如果图片存在私有目录,是不需要申请这个权限的。 diff --git a/app/src/main/java/me/zhouzhuo810/cameracardcropdemo/MainActivity.java b/app/src/main/java/me/zhouzhuo810/cameracardcropdemo/MainActivity.java index 35ae034..ca4d223 100644 --- a/app/src/main/java/me/zhouzhuo810/cameracardcropdemo/MainActivity.java +++ b/app/src/main/java/me/zhouzhuo810/cameracardcropdemo/MainActivity.java @@ -30,11 +30,11 @@ protected void onCreate(Bundle savedInstanceState) { public void takePhoto(View v) { Intent intent = new Intent(MainActivity.this, CropActivity.class); - // intent.putExtra(CameraConfig.RATIO_WIDTH, 855); - // intent.putExtra(CameraConfig.RATIO_HEIGHT, 541); + intent.putExtra(CameraConfig.RATIO_WIDTH, 855); + intent.putExtra(CameraConfig.RATIO_HEIGHT, 541); intent.putExtra(CameraConfig.NEED_WRITE_STORAGE_PERMISSION, false); - intent.putExtra(CameraConfig.RATIO_WIDTH, 3); - intent.putExtra(CameraConfig.RATIO_HEIGHT, 4); +// intent.putExtra(CameraConfig.RATIO_WIDTH, 3); +// intent.putExtra(CameraConfig.RATIO_HEIGHT, 4); intent.putExtra(CameraConfig.PERCENT_LARGE, 0.8f); intent.putExtra(CameraConfig.MASK_COLOR, 0x2f000000); intent.putExtra(CameraConfig.TOP_OFFSET, 0); diff --git a/camera-card-crop/build.gradle b/camera-card-crop/build.gradle index 66f7ad2..310cfa8 100644 --- a/camera-card-crop/build.gradle +++ b/camera-card-crop/build.gradle @@ -7,8 +7,8 @@ android { defaultConfig { minSdkVersion 15 targetSdkVersion 25 - versionCode 6 - versionName "1.5" + versionCode 7 + versionName "1.6" } buildTypes { release { diff --git a/camera-card-crop/src/main/java/me/zhouzhuo810/cameracardcrop/BitmapUtils.java b/camera-card-crop/src/main/java/me/zhouzhuo810/cameracardcrop/BitmapUtils.java index d4ec0f3..047a9f4 100644 --- a/camera-card-crop/src/main/java/me/zhouzhuo810/cameracardcrop/BitmapUtils.java +++ b/camera-card-crop/src/main/java/me/zhouzhuo810/cameracardcrop/BitmapUtils.java @@ -42,9 +42,9 @@ public static File saveBitMap(Context context, String filePath, final byte[] dat int degrees = getExifRotateDegree(filePath); BitmapFactory.Options options = new BitmapFactory.Options(); options.inPreferredConfig = Bitmap.Config.RGB_565; - Bitmap photo = BitmapFactory.decodeByteArray(data, 0, data.length,options); + Bitmap photo = BitmapFactory.decodeByteArray(data, 0, data.length, options); //图片竖屏 - photo = rotateBitmap(photo,degrees); + photo = rotateBitmap(photo, degrees); int scW = ScreenUtils.getScreenWidth(context); int scH = ScreenUtils.getScreenHeight(context); if (scW > scH) { @@ -52,10 +52,16 @@ public static File saveBitMap(Context context, String filePath, final byte[] dat scW = scH; scH = c; } - float ratio = scW * 1.0f / photo.getWidth(); - photo = Bitmap.createScaledBitmap(photo, (int)(photo.getWidth() * ratio), (int)(photo.getHeight() *ratio), true); - if (isNeedCut) { - photo = Bitmap.createBitmap(photo, rectLeft*photo.getWidth()/scW, rectTop* photo.getHeight() / scH , rectWidth*photo.getWidth()/scW, rectHeight* photo.getHeight() / scH); + //减去状态栏的高度 + int statusBarHeight = (int) Math.ceil(20 * context.getResources().getDisplayMetrics().density); + scH = scH - statusBarHeight; + //将图片宽度缩放到屏幕宽度一致 + float ratio = scW * 1.0f / photo.getWidth(); + photo = Bitmap.createScaledBitmap(photo, (int) (photo.getWidth() * ratio), (int) (photo.getHeight() * ratio), true); + if (isNeedCut && rectLeft > 0) { + float widthScale = photo.getWidth() * 1.0f / scW; + float heightScale = photo.getHeight() * 1.0f / scH; + photo = Bitmap.createBitmap(photo, (int) (rectLeft * widthScale), (int) (rectTop * heightScale), (int) (rectWidth * widthScale), (int) (rectHeight * heightScale)); } if (photo != null) { compressImageToFile(photo, file); @@ -66,10 +72,10 @@ public static File saveBitMap(Context context, String filePath, final byte[] dat } - private static int getExifRotateDegree(String path){ + private static int getExifRotateDegree(String path) { try { ExifInterface exifInterface = new ExifInterface(path); - int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION,ExifInterface.ORIENTATION_NORMAL); + int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); return getExifRotateDegrees(orientation); } catch (IOException e) { e.printStackTrace(); @@ -115,7 +121,7 @@ private static Bitmap rotateBitmap(Bitmap origin, float degrees) { } - public static void compressImageToFile(Bitmap bmp,File file) { + public static void compressImageToFile(Bitmap bmp, File file) { int options = 100; ByteArrayOutputStream baos = new ByteArrayOutputStream(); bmp.compress(Bitmap.CompressFormat.JPEG, options, baos); diff --git a/camera-card-crop/src/main/java/me/zhouzhuo810/cameracardcrop/CameraView.java b/camera-card-crop/src/main/java/me/zhouzhuo810/cameracardcrop/CameraView.java index 420c174..8c3b528 100644 --- a/camera-card-crop/src/main/java/me/zhouzhuo810/cameracardcrop/CameraView.java +++ b/camera-card-crop/src/main/java/me/zhouzhuo810/cameracardcrop/CameraView.java @@ -37,18 +37,22 @@ public CameraView(Context context, Camera camera) { } } - private void initCamera(Camera camera) throws Exception{ + private void initCamera(Camera camera) throws Exception { Camera.Parameters parameters = camera.getParameters(); List previewSizes = parameters.getSupportedPreviewSizes(); + int width = ScreenUtils.getScreenWidth(getContext()); + int height = ScreenUtils.getScreenHeight(getContext()); + int min = Math.min(width, height); + int max = Math.max(width, height); for (Camera.Size size : previewSizes) { - if (size.width / 16 == size.height / 9) { + if (size.width / max == size.height / min) { parameters.setPreviewSize(size.width, size.height); break; } } List pictureSizes = parameters.getSupportedPictureSizes(); for (Camera.Size size : pictureSizes) { - if (size.width / 16 == size.height / 9) { + if (size.width / max == size.height / min) { parameters.setPictureSize(size.width, size.height); break; } @@ -61,7 +65,7 @@ private void initCamera(Camera camera) throws Exception{ parameters.setJpegQuality(100); camera.setParameters(parameters); } - + /** * 是否横屏 * diff --git a/camera-card-crop/src/main/java/me/zhouzhuo810/cameracardcrop/RectView.java b/camera-card-crop/src/main/java/me/zhouzhuo810/cameracardcrop/RectView.java index fb6fedf..23df6a8 100644 --- a/camera-card-crop/src/main/java/me/zhouzhuo810/cameracardcrop/RectView.java +++ b/camera-card-crop/src/main/java/me/zhouzhuo810/cameracardcrop/RectView.java @@ -121,7 +121,6 @@ public void setRatioAndPercentOfScreen(int w, int h, float percent) { } } - // Log.e("XXX", "w=" + w + ",h=" + h + ",percnet=" + percent + ",width=" + width + ",height=" + height); invalidate(); } @@ -149,6 +148,7 @@ public void setTopOffset(int topOffset) { @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); + Log.e("width", width+""); if (width > 0) { boolean isLand = isLandscape(); drawBgWithoutRect(canvas, isLand);