From 857e76550a73f06aeba4220d3ca11e1063af88df Mon Sep 17 00:00:00 2001 From: T8RIN Date: Tue, 21 Jan 2025 13:19:50 +0300 Subject: [PATCH] Added None, Fill, Fit, FitWidth, FitHeight, Crop scale types for Stack Images tool --- .../core/data/image/AndroidImageScaler.kt | 36 ++++++++++--------- .../resources/src/main/res/values/strings.xml | 2 ++ .../data/AndroidImageStacker.kt | 22 ++++++------ .../image_stacking/domain/StackImage.kt | 2 +- .../presentation/components/StackImageItem.kt | 3 ++ 5 files changed, 37 insertions(+), 28 deletions(-) diff --git a/core/data/src/main/java/ru/tech/imageresizershrinker/core/data/image/AndroidImageScaler.kt b/core/data/src/main/java/ru/tech/imageresizershrinker/core/data/image/AndroidImageScaler.kt index b4a39b2ee..3992bcef0 100644 --- a/core/data/src/main/java/ru/tech/imageresizershrinker/core/data/image/AndroidImageScaler.kt +++ b/core/data/src/main/java/ru/tech/imageresizershrinker/core/data/image/AndroidImageScaler.kt @@ -290,26 +290,28 @@ internal class AndroidImageScaler @Inject constructor( imageScaleMode = imageScaleMode ) - val blurredBitmap = imageTransformer.transform( - image = drawImage.let { bitmap -> - val xScale: Float = targetWidth.toFloat() / originalWidth - val yScale: Float = targetHeight.toFloat() / originalHeight - val scale = xScale.coerceAtLeast(yScale) - createScaledBitmap( - image = bitmap, - width = (scale * originalWidth).toInt(), - height = (scale * originalHeight).toInt(), - imageScaleMode = imageScaleMode - ) - }, - transformations = listOf( - filterProvider.filterToTransformation( - createFilter( - blurRadius.toFloat() / 1000 * max(targetWidth, targetHeight) + val blurredBitmap = if (canvasColor == null) { + imageTransformer.transform( + image = drawImage.let { bitmap -> + val xScale: Float = targetWidth.toFloat() / originalWidth + val yScale: Float = targetHeight.toFloat() / originalHeight + val scale = xScale.coerceAtLeast(yScale) + createScaledBitmap( + image = bitmap, + width = (scale * originalWidth).toInt(), + height = (scale * originalHeight).toInt(), + imageScaleMode = imageScaleMode + ) + }, + transformations = listOf( + filterProvider.filterToTransformation( + createFilter( + blurRadius.toFloat() / 1000 * max(targetWidth, targetHeight) + ) ) ) ) - ) + } else null Bitmap.createBitmap( targetWidth, diff --git a/core/resources/src/main/res/values/strings.xml b/core/resources/src/main/res/values/strings.xml index dfe851482..babb8f235 100644 --- a/core/resources/src/main/res/values/strings.xml +++ b/core/resources/src/main/res/values/strings.xml @@ -1564,4 +1564,6 @@ Change metadata of single image without recompression Tap to edit available tags Change Sticker + Fit Width + Fit Height \ No newline at end of file diff --git a/feature/image-stacking/src/main/java/ru/tech/imageresizershrinker/feature/image_stacking/data/AndroidImageStacker.kt b/feature/image-stacking/src/main/java/ru/tech/imageresizershrinker/feature/image_stacking/data/AndroidImageStacker.kt index 36e820188..f5d116ef9 100644 --- a/feature/image-stacking/src/main/java/ru/tech/imageresizershrinker/feature/image_stacking/data/AndroidImageStacker.kt +++ b/feature/image-stacking/src/main/java/ru/tech/imageresizershrinker/feature/image_stacking/data/AndroidImageStacker.kt @@ -82,21 +82,23 @@ internal class AndroidImageStacker @Inject constructor( )?.let { bitmap -> bitmap.setHasAlpha(true) - when (stackImage.scale) { - StackImage.Scale.None -> bitmap - StackImage.Scale.Fill -> imageScaler.scaleImage( - image = bitmap, - width = resultSize.width, - height = resultSize.height - ) + val resizeType = when (stackImage.scale) { + StackImage.Scale.None -> null + StackImage.Scale.Fill -> ResizeType.Explicit + StackImage.Scale.Fit -> ResizeType.Flexible(ResizeAnchor.Min) + StackImage.Scale.FitWidth -> ResizeType.Flexible(ResizeAnchor.Width) + StackImage.Scale.FitHeight -> ResizeType.Flexible(ResizeAnchor.Height) + StackImage.Scale.Crop -> ResizeType.CenterCrop(0x00000000) + } - StackImage.Scale.Fit -> imageScaler.scaleImage( + resizeType?.let { + imageScaler.scaleImage( image = bitmap, width = resultSize.width, height = resultSize.height, - resizeType = ResizeType.Flexible(ResizeAnchor.Min) + resizeType = resizeType ) - } + } ?: bitmap } paint.alpha = (stackImage.alpha * 255).toInt() paint.xfermode = PorterDuffXfermode(stackImage.blendingMode.toPorterDuffMode()) diff --git a/feature/image-stacking/src/main/java/ru/tech/imageresizershrinker/feature/image_stacking/domain/StackImage.kt b/feature/image-stacking/src/main/java/ru/tech/imageresizershrinker/feature/image_stacking/domain/StackImage.kt index 07901db72..19908ada8 100644 --- a/feature/image-stacking/src/main/java/ru/tech/imageresizershrinker/feature/image_stacking/domain/StackImage.kt +++ b/feature/image-stacking/src/main/java/ru/tech/imageresizershrinker/feature/image_stacking/domain/StackImage.kt @@ -28,7 +28,7 @@ data class StackImage( val scale: Scale ) { enum class Scale { - None, Fill, Fit + None, Fill, Fit, FitWidth, FitHeight, Crop } } diff --git a/feature/image-stacking/src/main/java/ru/tech/imageresizershrinker/feature/image_stacking/presentation/components/StackImageItem.kt b/feature/image-stacking/src/main/java/ru/tech/imageresizershrinker/feature/image_stacking/presentation/components/StackImageItem.kt index 638a60911..3796b8535 100644 --- a/feature/image-stacking/src/main/java/ru/tech/imageresizershrinker/feature/image_stacking/presentation/components/StackImageItem.kt +++ b/feature/image-stacking/src/main/java/ru/tech/imageresizershrinker/feature/image_stacking/presentation/components/StackImageItem.kt @@ -212,6 +212,9 @@ fun StackImageItem( StackImage.Scale.None -> stringResource(R.string.none) StackImage.Scale.Fill -> stringResource(R.string.fill) StackImage.Scale.Fit -> stringResource(R.string.fit) + StackImage.Scale.FitWidth -> stringResource(R.string.fit_width) + StackImage.Scale.FitHeight -> stringResource(R.string.fit_height) + StackImage.Scale.Crop -> stringResource(R.string.crop) } }, color = Color.Unspecified,