From 328c575818d5dce2816487aa53de25160813a31a Mon Sep 17 00:00:00 2001 From: rmp22 <195054967+rmp22@users.noreply.github.com> Date: Thu, 27 Nov 2025 16:46:15 +0800 Subject: [PATCH] media: Center-cropping media bitmaps to improve quality applying ImageView's CenterCrop style of cropping to media bitmap Change-Id: I219142f5c9addbbfc08bfda0d23c8e3f71139139 Signed-off-by: rmp22 <195054967+rmp22@users.noreply.github.com> --- media/java/android/media/MediaMetadata.java | 29 ++++++++++++++++----- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/media/java/android/media/MediaMetadata.java b/media/java/android/media/MediaMetadata.java index 7b3a56801a355..dbbc5df084ea8 100644 --- a/media/java/android/media/MediaMetadata.java +++ b/media/java/android/media/MediaMetadata.java @@ -22,6 +22,9 @@ import android.compat.annotation.UnsupportedAppUsage; import android.content.ContentResolver; import android.graphics.Bitmap; import android.graphics.BitmapFactory; +import android.graphics.Canvas; +import android.graphics.Matrix; +import android.graphics.Paint; import android.media.browse.MediaBrowser; import android.media.session.MediaController; import android.media.session.MediaSession; @@ -976,13 +979,25 @@ public final class MediaMetadata implements Parcelable { } private Bitmap scaleBitmap(Bitmap bmp, int maxDimension) { - float maxDimensionF = maxDimension; - float widthScale = maxDimensionF / bmp.getWidth(); - float heightScale = maxDimensionF / bmp.getHeight(); - float scale = Math.min(widthScale, heightScale); - int height = (int) (bmp.getHeight() * scale); - int width = (int) (bmp.getWidth() * scale); - return Bitmap.createScaledBitmap(bmp, width, height, true); + if (bmp == null) return null; + int srcWidth = bmp.getWidth(); + int srcHeight = bmp.getHeight(); + float scale = Math.max( + (float) maxDimension / srcWidth, + (float) maxDimension / srcHeight + ); + float scaledWidth = scale * srcWidth; + float scaledHeight = scale * srcHeight; + float dx = (maxDimension - scaledWidth) / 2f; + float dy = (maxDimension - scaledHeight) / 2f; + Bitmap output = Bitmap.createBitmap(maxDimension, maxDimension, bmp.getConfig()); + Canvas canvas = new Canvas(output); + Matrix matrix = new Matrix(); + matrix.setScale(scale, scale); + matrix.postTranslate(dx, dy); + Paint paint = new Paint(Paint.FILTER_BITMAP_FLAG); + canvas.drawBitmap(bmp, matrix, paint); + return output; } } }