Просмотр исходного кода

支持16KB对齐
感谢 @niu-hb
Source: https://github.com/gedoor/legado/pull/5373/commits/76ce4b89a65c688e8a6232c4cb247bdbabbf33af

HapeLee 1 год назад
Родитель
Сommit
7cd2d09dc9

+ 0 - 3
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)

+ 70 - 9
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
 }
 
 /**

+ 0 - 1
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]