This commit is contained in:
kunfei 2022-03-28 21:16:19 +08:00
parent 706a7fd878
commit d1b3ce8a7b
6 changed files with 50 additions and 110 deletions

View File

@ -246,6 +246,8 @@ dependencies {
// //
implementation('cn.hutool:hutool-crypto:5.7.22') implementation('cn.hutool:hutool-crypto:5.7.22')
implementation('com.github.android:renderscript-intrinsics-replacement-toolkit:b6363490c3')
//com.github.AmrDeveloper:CodeView已集成到应用内 //com.github.AmrDeveloper:CodeView已集成到应用内
//epubLib集成到应用内 //epubLib集成到应用内

View File

@ -1,75 +0,0 @@
package io.legado.app.help
import android.annotation.TargetApi
import android.content.Context
import android.graphics.Bitmap
import android.os.Build
import android.renderscript.Allocation
import android.renderscript.Element
import android.renderscript.RenderScript
import android.renderscript.ScriptIntrinsicBlur
import androidx.annotation.IntRange
import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool
import com.bumptech.glide.load.resource.bitmap.CenterCrop
import java.security.MessageDigest
import kotlin.math.min
import kotlin.math.roundToInt
/**
* 模糊
* @radius: 0..25
*/
class BlurTransformation(
context: Context,
@IntRange(from = 0, to = 25) private val radius: Int
) : CenterCrop() {
private val rs: RenderScript = RenderScript.create(context)
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
override fun transform(
pool: BitmapPool,
toTransform: Bitmap,
outWidth: Int,
outHeight: Int
): Bitmap {
val transform = super.transform(pool, toTransform, outWidth, outHeight)
//图片缩小1/2
val width = (min(outWidth, transform.width) / 2f).roundToInt()
val height = (min(outHeight, transform.height) / 2f).roundToInt()
val blurredBitmap = Bitmap.createScaledBitmap(transform, width, height, false)
// Allocate memory for Renderscript to work with
//分配用于渲染脚本的内存
val input = Allocation.createFromBitmap(
rs,
blurredBitmap,
Allocation.MipmapControl.MIPMAP_FULL,
Allocation.USAGE_SHARED
)
val output = Allocation.createTyped(rs, input.type)
// Load up an instance of the specific script that we want to use.
//加载我们想要使用的特定脚本的实例。
val script = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs))
script.setInput(input)
// Set the blur radius
//设置模糊半径0..25
script.setRadius(radius.toFloat())
// Start the ScriptIntrinsicBlur
//启动 ScriptIntrinsicBlur,
script.forEach(output)
// Copy the output to the blurred bitmap
//将输出复制到模糊的位图
output.copyTo(blurredBitmap)
return blurredBitmap
}
override fun updateDiskCacheKey(messageDigest: MessageDigest) {
messageDigest.update("blur transformation".toByteArray())
}
}

View File

@ -73,7 +73,7 @@ object ThemeConfig {
if (bgCfg.second == 0) { if (bgCfg.second == 0) {
return bgImage return bgImage
} }
return bgImage.stackBlur(bgCfg.second.toFloat()) return bgImage.stackBlur(bgCfg.second)
} }
fun upConfig() { fun upConfig() {

View File

@ -0,0 +1,41 @@
package io.legado.app.help.glide
import android.annotation.TargetApi
import android.graphics.Bitmap
import android.os.Build
import androidx.annotation.IntRange
import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool
import com.bumptech.glide.load.resource.bitmap.CenterCrop
import io.legado.app.utils.stackBlur
import java.security.MessageDigest
import kotlin.math.min
import kotlin.math.roundToInt
/**
* 模糊
* @radius: 0..25
*/
class BlurTransformation(
@IntRange(from = 0, to = 25) private val radius: Int
) : CenterCrop() {
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
override fun transform(
pool: BitmapPool,
toTransform: Bitmap,
outWidth: Int,
outHeight: Int
): Bitmap {
val transform = super.transform(pool, toTransform, outWidth, outHeight)
//图片缩小1/2
val width = (min(outWidth, transform.width) / 5f).roundToInt()
val height = (min(outHeight, transform.height) / 5f).roundToInt()
val blurredBitmap = Bitmap.createScaledBitmap(transform, width, height, false)
return blurredBitmap.stackBlur(radius)
}
override fun updateDiskCacheKey(messageDigest: MessageDigest) {
messageDigest.update("blur transformation".toByteArray())
}
}

View File

@ -11,10 +11,10 @@ import io.legado.app.R
import io.legado.app.constant.PreferKey import io.legado.app.constant.PreferKey
import io.legado.app.data.entities.BaseSource import io.legado.app.data.entities.BaseSource
import io.legado.app.data.entities.Book import io.legado.app.data.entities.Book
import io.legado.app.help.BlurTransformation
import io.legado.app.help.CacheManager import io.legado.app.help.CacheManager
import io.legado.app.help.DefaultData import io.legado.app.help.DefaultData
import io.legado.app.help.config.AppConfig import io.legado.app.help.config.AppConfig
import io.legado.app.help.glide.BlurTransformation
import io.legado.app.help.glide.ImageLoader import io.legado.app.help.glide.ImageLoader
import io.legado.app.help.glide.OkHttpModelLoader import io.legado.app.help.glide.OkHttpModelLoader
import io.legado.app.model.analyzeRule.AnalyzeRule import io.legado.app.model.analyzeRule.AnalyzeRule
@ -86,7 +86,7 @@ object BookCover {
loadOnlyWifi: Boolean = false loadOnlyWifi: Boolean = false
): RequestBuilder<Drawable> { ): RequestBuilder<Drawable> {
val loadBlur = ImageLoader.load(context, defaultDrawable) val loadBlur = ImageLoader.load(context, defaultDrawable)
.apply(RequestOptions.bitmapTransform(BlurTransformation(context, 25))) .apply(RequestOptions.bitmapTransform(BlurTransformation(25)))
return if (AppConfig.useDefaultCover) { return if (AppConfig.useDefaultCover) {
loadBlur.centerCrop() loadBlur.centerCrop()
} else { } else {
@ -95,7 +95,7 @@ object BookCover {
.apply(options) .apply(options)
.transition(DrawableTransitionOptions.withCrossFade(1500)) .transition(DrawableTransitionOptions.withCrossFade(1500))
.thumbnail(loadBlur) .thumbnail(loadBlur)
.apply(RequestOptions.bitmapTransform(BlurTransformation(context, 25))) .apply(RequestOptions.bitmapTransform(BlurTransformation(25)))
.centerCrop() .centerCrop()
} }
} }

View File

@ -5,12 +5,8 @@ package io.legado.app.utils
import android.content.Context import android.content.Context
import android.graphics.* import android.graphics.*
import android.graphics.Bitmap.Config import android.graphics.Bitmap.Config
import android.renderscript.Allocation
import android.renderscript.Element
import android.renderscript.RenderScript
import android.renderscript.ScriptIntrinsicBlur
import android.view.View import android.view.View
import splitties.init.appCtx import com.google.android.renderscript.Toolkit
import java.io.FileInputStream import java.io.FileInputStream
import java.io.IOException import java.io.IOException
import kotlin.math.* import kotlin.math.*
@ -250,33 +246,9 @@ fun Bitmap.changeSize(newWidth: Int, newHeight: Int): Bitmap {
/** /**
* 高斯模糊 * 高斯模糊
*/ */
fun Bitmap.stackBlur(radius: Float = 8f): Bitmap? { fun Bitmap.stackBlur(radius: Int = 8): Bitmap {
val rs = RenderScript.create(appCtx)
val blurredBitmap = this.copy(Config.ARGB_8888, true) val blurredBitmap = this.copy(Config.ARGB_8888, true)
return Toolkit.blur(blurredBitmap, radius)
//分配用于渲染脚本的内存
val input = Allocation.createFromBitmap(
rs,
blurredBitmap,
Allocation.MipmapControl.MIPMAP_FULL,
Allocation.USAGE_SHARED
)
val output = Allocation.createTyped(rs, input.type)
//加载我们想要使用的特定脚本的实例。
val script = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs))
script.setInput(input)
//设置模糊半径
script.setRadius(radius)
//启动 ScriptIntrinsicBlur
script.forEach(output)
//将输出复制到模糊的位图
output.copyTo(blurredBitmap)
return blurredBitmap
} }
/** /**