@@ -11,6 +11,9 @@ import android.renderscript.RenderScript.RSMessageHandler
1111import android.renderscript.ScriptIntrinsicBlur
1212import android.widget.ImageView
1313import com.tamsiree.rxkit.RxImageTool.isEmptyBitmap
14+ import kotlin.math.abs
15+ import kotlin.math.max
16+ import kotlin.math.min
1417
1518/* *
1619 * RenderScript图片高斯模糊
@@ -20,34 +23,33 @@ object TBlurTool {
2023 /* *
2124 * 建议模糊度(在0.0到25.0之间)
2225 */
23- private const val BLUR_RADIUS = 20
26+ private const val BLUR_RADIUS = 20f
2427 private const val SCALED_WIDTH = 100
2528 private const val SCALED_HEIGHT = 100
2629
2730 @JvmOverloads
2831 @JvmStatic
29- fun blur (imageView : ImageView , bitmap : Bitmap ? , radius : Int = BLUR_RADIUS ) {
32+ fun blur (imageView : ImageView , bitmap : Bitmap , radius : Float = BLUR_RADIUS ) {
3033 imageView.setImageBitmap(getBlurBitmap(imageView.context, bitmap, radius))
3134 }
3235
3336 @JvmStatic
34- fun getBlurBitmap (context : Context ? , bitmap : Bitmap ? ): Bitmap {
37+ fun getBlurBitmap (context : Context , bitmap : Bitmap ): Bitmap {
3538 return getBlurBitmap(context, bitmap, BLUR_RADIUS )
3639 }
3740
3841 /* *
3942 * 得到模糊后的bitmap
40- * thanks http://wl9739.github.io/2016/07/14/教你一分钟实现模糊效果/
4143 *
4244 * @param context
4345 * @param bitmap
4446 * @param radius
4547 * @return
4648 */
4749 @JvmStatic
48- fun getBlurBitmap (context : Context ? , bitmap : Bitmap ? , radius : Int ): Bitmap {
50+ fun getBlurBitmap (context : Context , bitmap : Bitmap , radius : Float ): Bitmap {
4951 // 将缩小后的图片做为预渲染的图片。
50- val inputBitmap = Bitmap .createScaledBitmap(bitmap!! , SCALED_WIDTH , SCALED_HEIGHT , false )
52+ val inputBitmap = Bitmap .createScaledBitmap(bitmap, SCALED_WIDTH , SCALED_HEIGHT , false )
5153 // 创建一张渲染后的输出图片。
5254 val outputBitmap = Bitmap .createBitmap(inputBitmap)
5355
@@ -62,7 +64,7 @@ object TBlurTool {
6264 val tmpOut = Allocation .createFromBitmap(rs, outputBitmap)
6365
6466 // 设置渲染的模糊程度, 25f是最大模糊度
65- blurScript.setRadius(radius.toFloat() )
67+ blurScript.setRadius(radius)
6668 // 设置blurScript对象的输入内存
6769 blurScript.setInput(tmpIn)
6870 // 将输出数据保存到输出内存中
@@ -72,17 +74,7 @@ object TBlurTool {
7274 tmpOut.copyTo(outputBitmap)
7375 return outputBitmap
7476 }
75- /* *
76- * 快速模糊
77- *
78- * 先缩小原图,对小图进行模糊,再放大回原先尺寸
79- *
80- * @param src 源图片
81- * @param scale 缩小倍数(0...1)
82- * @param radius 模糊半径
83- * @param recycle 是否回收
84- * @return 模糊后的图片
85- */
77+
8678 /* *
8779 * 快速模糊
8880 *
@@ -139,8 +131,8 @@ object TBlurTool {
139131 */
140132 @TargetApi(Build .VERSION_CODES .JELLY_BEAN_MR1 )
141133 @JvmStatic
142- fun renderScriptBlur (src : Bitmap ? , radius : Float ): Bitmap ? {
143- var radius = radius
134+ fun renderScriptBlur (src : Bitmap , radius : Float ): Bitmap ? {
135+ var mRadius = radius
144136 if (isEmptyBitmap(src)) return null
145137 var rs: RenderScript ? = null
146138 try {
@@ -149,13 +141,13 @@ object TBlurTool {
149141 val input = Allocation .createFromBitmap(rs, src, Allocation .MipmapControl .MIPMAP_NONE , Allocation .USAGE_SCRIPT )
150142 val output = Allocation .createTyped(rs, input.type)
151143 val blurScript = ScriptIntrinsicBlur .create(rs, Element .U8_4 (rs))
152- if (radius > 25 ) {
153- radius = 25.0f
154- } else if (radius <= 0 ) {
155- radius = 1.0f
144+ if (mRadius > 25 ) {
145+ mRadius = 25.0f
146+ } else if (mRadius <= 0 ) {
147+ mRadius = 1.0f
156148 }
157149 blurScript.setInput(input)
158- blurScript.setRadius(radius )
150+ blurScript.setRadius(mRadius )
159151 blurScript.forEach(output)
160152 output.copyTo(src)
161153 } finally {
@@ -173,17 +165,16 @@ object TBlurTool {
173165 * @return stackBlur模糊图片
174166 */
175167 @JvmStatic
176- fun stackBlur (src : Bitmap ? , radius : Int , recycle : Boolean ): Bitmap ? {
177- val ret: Bitmap ?
178- ret = if (recycle) {
168+ fun stackBlur (src : Bitmap , radius : Int , recycle : Boolean ): Bitmap ? {
169+ val ret: Bitmap = if (recycle) {
179170 src
180171 } else {
181- src!! .copy(src.config, true )
172+ src.copy(src.config, true )
182173 }
183174 if (radius < 1 ) {
184175 return null
185176 }
186- val w = ret!! .width
177+ val w = ret.width
187178 val h = ret.height
188179 val pix = IntArray (w * h)
189180 ret.getPixels(pix, 0 , w, 0 , 0 , w, h)
@@ -204,7 +195,7 @@ object TBlurTool {
204195 var yp: Int
205196 var yi: Int
206197 var yw: Int
207- val vmin = IntArray (Math . max(w, h))
198+ val vmin = IntArray (max(w, h))
208199 var divsum = div + 1 shr 1
209200 divsum * = divsum
210201 val dv = IntArray (256 * divsum)
@@ -240,12 +231,12 @@ object TBlurTool {
240231 rinsum = ginsum
241232 i = - radius
242233 while (i <= radius) {
243- p = pix[yi + Math . min(wm, Math . max(i, 0 ))]
234+ p = pix[yi + min(wm, max(i, 0 ))]
244235 sir = stack[i + radius]
245236 sir[0 ] = p and 0xff0000 shr 16
246237 sir[1 ] = p and 0x00ff00 shr 8
247238 sir[2 ] = p and 0x0000ff
248- rbs = r1 - Math . abs(i)
239+ rbs = r1 - abs(i)
249240 rsum + = sir[0 ] * rbs
250241 gsum + = sir[1 ] * rbs
251242 bsum + = sir[2 ] * rbs
@@ -275,7 +266,7 @@ object TBlurTool {
275266 goutsum - = sir[1 ]
276267 boutsum - = sir[2 ]
277268 if (y == 0 ) {
278- vmin[x] = Math . min(x + radius + 1 , wm)
269+ vmin[x] = min(x + radius + 1 , wm)
279270 }
280271 p = pix[yw + vmin[x]]
281272 sir[0 ] = p and 0xff0000 shr 16
@@ -315,12 +306,12 @@ object TBlurTool {
315306 yp = - radius * w
316307 i = - radius
317308 while (i <= radius) {
318- yi = Math . max(0 , yp) + x
309+ yi = max(0 , yp) + x
319310 sir = stack[i + radius]
320311 sir[0 ] = r[yi]
321312 sir[1 ] = g[yi]
322313 sir[2 ] = b[yi]
323- rbs = r1 - Math . abs(i)
314+ rbs = r1 - abs(i)
324315 rsum + = r[yi] * rbs
325316 gsum + = g[yi] * rbs
326317 bsum + = b[yi] * rbs
@@ -354,7 +345,7 @@ object TBlurTool {
354345 goutsum - = sir[1 ]
355346 boutsum - = sir[2 ]
356347 if (x == 0 ) {
357- vmin[y] = Math . min(y + r1, hm) * w
348+ vmin[y] = min(y + r1, hm) * w
358349 }
359350 p = x + vmin[y]
360351 sir[0 ] = r[p]
0 commit comments