支持16KB对齐
感谢 @niu-hb Source: https://github.com/gedoor/legado/pull/5373/commits/76ce4b89a65c688e8a6232c4cb247bdbabbf33af
This commit is contained in:
@@ -191,9 +191,6 @@ dependencies {
|
|||||||
implementation(libs.bundles.coroutines)
|
implementation(libs.bundles.coroutines)
|
||||||
|
|
||||||
|
|
||||||
//图像处理库Toolkit
|
|
||||||
implementation(libs.renderscript.intrinsics.replacement.toolkit)
|
|
||||||
|
|
||||||
//androidX
|
//androidX
|
||||||
implementation(libs.core.ktx)
|
implementation(libs.core.ktx)
|
||||||
implementation(libs.appcompat.appcompat)
|
implementation(libs.appcompat.appcompat)
|
||||||
|
|||||||
@@ -6,10 +6,23 @@ import android.content.Context
|
|||||||
import android.graphics.Bitmap
|
import android.graphics.Bitmap
|
||||||
import android.graphics.Bitmap.Config
|
import android.graphics.Bitmap.Config
|
||||||
import android.graphics.BitmapFactory
|
import android.graphics.BitmapFactory
|
||||||
|
import android.graphics.BlurMaskFilter
|
||||||
|
import android.graphics.Canvas
|
||||||
import android.graphics.Color
|
import android.graphics.Color
|
||||||
import com.google.android.renderscript.Toolkit
|
import android.graphics.Paint
|
||||||
import java.io.*
|
import androidx.core.graphics.createBitmap
|
||||||
import kotlin.math.*
|
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")
|
@Suppress("WeakerAccess", "MemberVisibilityCanBePrivate")
|
||||||
@@ -224,17 +237,65 @@ object BitmapUtils {
|
|||||||
* 获取指定宽高的图片
|
* 获取指定宽高的图片
|
||||||
*/
|
*/
|
||||||
fun Bitmap.resizeAndRecycle(newWidth: Int, newHeight: Int): Bitmap {
|
fun Bitmap.resizeAndRecycle(newWidth: Int, newHeight: Int): Bitmap {
|
||||||
//获取新的bitmap
|
val scaledBitmap = this.scale(newWidth, newHeight)
|
||||||
val bitmap = Toolkit.resize(this, newWidth, newHeight)
|
// 回收原始 bitmap
|
||||||
recycle()
|
if (this != scaledBitmap) {
|
||||||
return bitmap
|
recycle()
|
||||||
|
}
|
||||||
|
return scaledBitmap
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 高斯模糊
|
* 高斯模糊
|
||||||
*/
|
*/
|
||||||
fun Bitmap.stackBlur(radius: Int = 8): Bitmap {
|
fun Bitmap.stackBlur(radius: Int = 8, scale: Int = 2): Bitmap {
|
||||||
return Toolkit.blur(this, radius)
|
// 限制参数范围
|
||||||
|
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
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -166,7 +166,6 @@ material = { module = "com.google.android.material:material", version.ref = "mat
|
|||||||
|
|
||||||
mozilla-rhino = { module = "org.mozilla:rhino", version.ref = "rhino" }
|
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" }
|
zxing-lite = { module = "com.github.jenly1314:zxing-lite", version.ref = "zxingLite" }
|
||||||
|
|
||||||
[bundles]
|
[bundles]
|
||||||
|
|||||||
Reference in New Issue
Block a user