From e07931fd3bca74121612617bb84d16b65a9b46b9 Mon Sep 17 00:00:00 2001 From: ZhanGSKen Date: Tue, 28 Apr 2026 09:51:49 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E8=A3=81=E5=89=AA=E7=AA=97?= =?UTF-8?q?=E5=8F=A3=E7=94=BB=E5=B8=83=E6=8E=A7=E4=BB=B6=E8=A3=81=E5=89=AA?= =?UTF-8?q?=E6=BA=90=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加getCanvasBitmap()方法创建包含背景的画布位图 - 裁剪源使用画布位图,与预览显示一致 --- gallery/build.properties | 4 +-- .../winboll/studio/gallery/CropActivity.java | 35 ++++++++++--------- .../studio/gallery/CropCanvasView.java | 24 ++++++++++++- 3 files changed, 44 insertions(+), 19 deletions(-) diff --git a/gallery/build.properties b/gallery/build.properties index 0f6099e..50fcf6e 100644 --- a/gallery/build.properties +++ b/gallery/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Tue Apr 28 09:22:58 CST 2026 +#Tue Apr 28 09:48:58 CST 2026 stageCount=7 libraryProject= baseVersion=15.0 publishVersion=15.0.6 -buildCount=23 +buildCount=30 baseBetaVersion=15.0.7 diff --git a/gallery/src/main/java/cc/winboll/studio/gallery/CropActivity.java b/gallery/src/main/java/cc/winboll/studio/gallery/CropActivity.java index b7ab388..e0f0ff5 100644 --- a/gallery/src/main/java/cc/winboll/studio/gallery/CropActivity.java +++ b/gallery/src/main/java/cc/winboll/studio/gallery/CropActivity.java @@ -147,28 +147,31 @@ public class CropActivity extends AppCompatActivity { } try { + Bitmap canvasBitmap = cropCanvasView.getCanvasBitmap(); + if (canvasBitmap == null || canvasBitmap.isRecycled()) { + Toast.makeText(this, "Failed to get canvas bitmap", Toast.LENGTH_SHORT).show(); + return; + } + RectF cropRect = cropCanvasView.getCropRect(); - RectF imageBounds = cropCanvasView.getImageBounds(); - float cropX = cropRect.left - imageBounds.left; - float cropY = cropRect.top - imageBounds.top; - float cropW = cropRect.width(); - float cropH = cropRect.height(); + int bmpX = (int) cropRect.left; + int bmpY = (int) cropRect.top; + int bmpW = (int) cropRect.width(); + int bmpH = (int) cropRect.height(); - int bmpX = (int) cropX; - int bmpY = (int) cropY; - int bmpW = (int) cropW; - int bmpH = (int) cropH; - - bmpX = Math.max(0, Math.min(bmpX, originalBitmap.getWidth() - 1)); - bmpY = Math.max(0, Math.min(bmpY, originalBitmap.getHeight() - 1)); - bmpW = Math.max(1, Math.min(bmpW, originalBitmap.getWidth() - bmpX)); - bmpH = Math.max(1, Math.min(bmpH, originalBitmap.getHeight() - bmpY)); + bmpX = Math.max(0, Math.min(bmpX, canvasBitmap.getWidth() - 1)); + bmpY = Math.max(0, Math.min(bmpY, canvasBitmap.getHeight() - 1)); + bmpW = Math.max(1, Math.min(bmpW, canvasBitmap.getWidth() - bmpX)); + bmpH = Math.max(1, Math.min(bmpH, canvasBitmap.getHeight() - bmpY)); + LogUtils.d(TAG, "saveCroppedCover: cropRect=" + cropRect); LogUtils.d(TAG, "saveCroppedCover: crop=(" + bmpX + "," + bmpY + "," + bmpW + "," + bmpH + ")"); - LogUtils.d(TAG, "saveCroppedCover: original size=" + originalBitmap.getWidth() + "x" + originalBitmap.getHeight()); + LogUtils.d(TAG, "saveCroppedCover: canvas size=" + canvasBitmap.getWidth() + "x" + canvasBitmap.getHeight()); + + Bitmap cropped = Bitmap.createBitmap(canvasBitmap, bmpX, bmpY, bmpW, bmpH); + canvasBitmap.recycle(); - Bitmap cropped = Bitmap.createBitmap(originalBitmap, bmpX, bmpY, bmpW, bmpH); LogUtils.d(TAG, "saveCroppedCover: cropped size=" + cropped.getWidth() + "x" + cropped.getHeight()); File coverDir = new File(getFilesDir(), "covers"); diff --git a/gallery/src/main/java/cc/winboll/studio/gallery/CropCanvasView.java b/gallery/src/main/java/cc/winboll/studio/gallery/CropCanvasView.java index 652d22c..13b59fb 100644 --- a/gallery/src/main/java/cc/winboll/studio/gallery/CropCanvasView.java +++ b/gallery/src/main/java/cc/winboll/studio/gallery/CropCanvasView.java @@ -120,6 +120,28 @@ public class CropCanvasView extends View { return displayBitmapScale; } + public Bitmap getCanvasBitmap() { + if (canvasWidth <= 0 || canvasHeight <= 0) { + return null; + } + Bitmap canvasBmp = Bitmap.createBitmap(canvasWidth, canvasHeight, Bitmap.Config.ARGB_8888); + Canvas canvas = new Canvas(canvasBmp); + canvas.drawColor(backgroundColor); + if (displayBitmap != null && !displayBitmap.isRecycled()) { + if (displayBitmap == originalBitmap) { + canvas.drawBitmap(displayBitmap, imageBounds.left, imageBounds.top, imagePaint); + } else { + float invScale = 1f / displayBitmapScale; + canvas.save(); + canvas.scale(invScale, invScale); + canvas.drawBitmap(displayBitmap, imageBounds.left * displayBitmapScale, + imageBounds.top * displayBitmapScale, imagePaint); + canvas.restore(); + } + } + return canvasBmp; + } + public void initCanvas(int imgWidth, int imgHeight, float ratio) { this.imageWidth = imgWidth; this.imageHeight = imgHeight; @@ -143,7 +165,7 @@ public class CropCanvasView extends View { imageBounds.set(left, top, left + imageWidth, top + imageHeight); canvasBounds.set(0, 0, canvasWidth, canvasHeight); - cropRect = new RectF(0, 0, canvasWidth, canvasHeight); + cropRect = new RectF(canvasBounds); requestLayout(); invalidate();