From 7cd2d09dc9bc3c4f1c4615e7573c3adc4617f6d1 Mon Sep 17 00:00:00 2001 From: HapeLee <1321903405@qq.com> Date: Sun, 31 Aug 2025 02:40:56 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E6=8C=8116KB=E5=AF=B9=E9=BD=90=20?= =?UTF-8?q?=E6=84=9F=E8=B0=A2=20@niu-hb=20Source:=20https://github.com/ged?= =?UTF-8?q?oor/legado/pull/5373/commits/76ce4b89a65c688e8a6232c4cb247bdbab?= =?UTF-8?q?bf33af?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 3 - .../io/legato/kazusa/utils/BitmapUtils.kt | 79 ++++++++++++++++--- gradle/libs.versions.toml | 1 - 3 files changed, 70 insertions(+), 13 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 8abed54b6..b03da7251 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -191,9 +191,6 @@ dependencies { implementation(libs.bundles.coroutines) - //图像处理库Toolkit - implementation(libs.renderscript.intrinsics.replacement.toolkit) - //androidX implementation(libs.core.ktx) implementation(libs.appcompat.appcompat) diff --git a/app/src/main/java/io/legato/kazusa/utils/BitmapUtils.kt b/app/src/main/java/io/legato/kazusa/utils/BitmapUtils.kt index 9623cd89f..2275fee94 100644 --- a/app/src/main/java/io/legato/kazusa/utils/BitmapUtils.kt +++ b/app/src/main/java/io/legato/kazusa/utils/BitmapUtils.kt @@ -6,10 +6,23 @@ import android.content.Context import android.graphics.Bitmap import android.graphics.Bitmap.Config import android.graphics.BitmapFactory +import android.graphics.BlurMaskFilter +import android.graphics.Canvas import android.graphics.Color -import com.google.android.renderscript.Toolkit -import java.io.* -import kotlin.math.* +import android.graphics.Paint +import androidx.core.graphics.createBitmap +import androidx.core.graphics.scale +import java.io.ByteArrayInputStream +import java.io.ByteArrayOutputStream +import java.io.FileInputStream +import java.io.IOException +import java.io.InputStream +import kotlin.math.ceil +import kotlin.math.floor +import kotlin.math.max +import kotlin.math.min +import kotlin.math.roundToInt +import kotlin.math.sqrt @Suppress("WeakerAccess", "MemberVisibilityCanBePrivate") @@ -224,17 +237,65 @@ object BitmapUtils { * 获取指定宽高的图片 */ fun Bitmap.resizeAndRecycle(newWidth: Int, newHeight: Int): Bitmap { - //获取新的bitmap - val bitmap = Toolkit.resize(this, newWidth, newHeight) - recycle() - return bitmap + val scaledBitmap = this.scale(newWidth, newHeight) + // 回收原始 bitmap + if (this != scaledBitmap) { + recycle() + } + return scaledBitmap } /** * 高斯模糊 */ -fun Bitmap.stackBlur(radius: Int = 8): Bitmap { - return Toolkit.blur(this, radius) +fun Bitmap.stackBlur(radius: Int = 8, scale: Int = 2): Bitmap { + // 限制参数范围 + val validRadius = radius.coerceIn(1, 25) + val validScale = scale.coerceIn(1, 8) // 缩放比例不超过8倍,避免过度损失细节 + + // 当缩放比例为1时直接处理原图(无性能优化,保留最佳效果) + if (validScale == 1) { + return createBlurredBitmap(this, validRadius) + } + + // 计算缩放后的尺寸 + val scaledWidth = width / validScale + val scaledHeight = height / validScale + + // 避免缩放后尺寸为0(针对极小图片) + if (scaledWidth <= 0 || scaledHeight <= 0) { + return createBlurredBitmap(this, validRadius) + } + + // 创建缩放后的临时Bitmap + val scaledBitmap = this.scale(scaledWidth, scaledHeight) + + // 对缩放后的图片应用模糊 + val blurredScaled = createBlurredBitmap(scaledBitmap, validRadius) + + // 放大回原始尺寸 + val result = blurredScaled.scale(width, height) + + // 释放临时资源 + scaledBitmap.recycle() + blurredScaled.recycle() + + return result +} + +/** + * 基础模糊处理函数,直接对Bitmap应用模糊滤镜 + */ +private fun createBlurredBitmap(bitmap: Bitmap, radius: Int): Bitmap { + val output = createBitmap(bitmap.width, bitmap.height) + val canvas = Canvas(output) + val paint = Paint().apply { + isAntiAlias = true + isFilterBitmap = true + maskFilter = BlurMaskFilter(radius.toFloat(), BlurMaskFilter.Blur.NORMAL) + } + canvas.drawBitmap(bitmap, 0f, 0f, paint) + return output } /** diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index ba0f87ed3..29bbc050c 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -166,7 +166,6 @@ material = { module = "com.google.android.material:material", version.ref = "mat mozilla-rhino = { module = "org.mozilla:rhino", version.ref = "rhino" } -renderscript-intrinsics-replacement-toolkit = { module = "com.github.android:renderscript-intrinsics-replacement-toolkit", version = "b6363490c3" } zxing-lite = { module = "com.github.jenly1314:zxing-lite", version.ref = "zxingLite" } [bundles]