Skip to content

Commit 819401a

Browse files
authored
Create BlurUtils.kt
1 parent d254c4a commit 819401a

File tree

1 file changed

+231
-0
lines changed

1 file changed

+231
-0
lines changed
Lines changed: 231 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,231 @@
1+
package me.bzcoder.easyglide.util
2+
3+
import android.content.Context
4+
import android.graphics.Bitmap
5+
import android.os.Build
6+
import android.renderscript.Allocation
7+
import android.renderscript.Element
8+
import android.renderscript.RenderScript
9+
import android.renderscript.ScriptIntrinsicBlur
10+
import androidx.annotation.RequiresApi
11+
import android.view.View2
12+
13+
/**
14+
* @author sunfusheng on 2018/6/25.
15+
*/
16+
object BlurUtils {
17+
fun rsBlur(context: Context?, toTransform: Bitmap, radius: Int): Bitmap {
18+
val renderScript = RenderScript.create(context)
19+
val input = Allocation.createFromBitmap(renderScript, toTransform)
20+
val output = Allocation.createTyped(renderScript, input.type)
21+
val scriptIntrinsicBlur = ScriptIntrinsicBlur.create(renderScript, Element.U8_4(renderScript))
22+
scriptIntrinsicBlur.setInput(input)
23+
scriptIntrinsicBlur.setRadius(radius.toFloat())
24+
scriptIntrinsicBlur.forEach(output)
25+
output.copyTo(toTransform)
26+
renderScript.destroy()
27+
return toTransform
28+
}
29+
30+
fun blur(toTransform: Bitmap, radius: Int): Bitmap? {
31+
if (radius < 1) {
32+
return null
33+
}
34+
val w = toTransform.width
35+
val h = toTransform.height
36+
val pix = IntArray(w * h)
37+
toTransform.getPixels(pix, 0, w, 0, 0, w, h)
38+
val wm = w - 1
39+
val hm = h - 1
40+
val wh = w * h
41+
val div = radius + radius + 1
42+
val r = IntArray(wh)
43+
val g = IntArray(wh)
44+
val b = IntArray(wh)
45+
var rsum: Int
46+
var gsum: Int
47+
var bsum: Int
48+
var x: Int
49+
var y: Int
50+
var i: Int
51+
var p: Int
52+
var yp: Int
53+
var yi: Int
54+
var yw: Int
55+
val vmin = IntArray(Math.max(w, h))
56+
var divsum = div + 1 shr 1
57+
divsum *= divsum
58+
val dv = IntArray(256 * divsum)
59+
i = 0
60+
while (i < 256 * divsum) {
61+
dv[i] = i / divsum
62+
i++
63+
}
64+
yi = 0
65+
yw = yi
66+
val stack = Array(div) { IntArray(3) }
67+
var stackpointer: Int
68+
var stackstart: Int
69+
var sir: IntArray
70+
var rbs: Int
71+
val r1 = radius + 1
72+
var routsum: Int
73+
var goutsum: Int
74+
var boutsum: Int
75+
var rinsum: Int
76+
var ginsum: Int
77+
var binsum: Int
78+
y = 0
79+
while (y < h) {
80+
bsum = 0
81+
gsum = bsum
82+
rsum = gsum
83+
boutsum = rsum
84+
goutsum = boutsum
85+
routsum = goutsum
86+
binsum = routsum
87+
ginsum = binsum
88+
rinsum = ginsum
89+
i = -radius
90+
while (i <= radius) {
91+
p = pix[yi + Math.min(wm, Math.max(i, 0))]
92+
sir = stack[i + radius]
93+
sir[0] = p and 0xff0000 shr 16
94+
sir[1] = p and 0x00ff00 shr 8
95+
sir[2] = p and 0x0000ff
96+
rbs = r1 - Math.abs(i)
97+
rsum += sir[0] * rbs
98+
gsum += sir[1] * rbs
99+
bsum += sir[2] * rbs
100+
if (i > 0) {
101+
rinsum += sir[0]
102+
ginsum += sir[1]
103+
binsum += sir[2]
104+
} else {
105+
routsum += sir[0]
106+
goutsum += sir[1]
107+
boutsum += sir[2]
108+
}
109+
i++
110+
}
111+
stackpointer = radius
112+
x = 0
113+
while (x < w) {
114+
r[yi] = dv[rsum]
115+
g[yi] = dv[gsum]
116+
b[yi] = dv[bsum]
117+
rsum -= routsum
118+
gsum -= goutsum
119+
bsum -= boutsum
120+
stackstart = stackpointer - radius + div
121+
sir = stack[stackstart % div]
122+
routsum -= sir[0]
123+
goutsum -= sir[1]
124+
boutsum -= sir[2]
125+
if (y == 0) {
126+
vmin[x] = Math.min(x + radius + 1, wm)
127+
}
128+
p = pix[yw + vmin[x]]
129+
sir[0] = p and 0xff0000 shr 16
130+
sir[1] = p and 0x00ff00 shr 8
131+
sir[2] = p and 0x0000ff
132+
rinsum += sir[0]
133+
ginsum += sir[1]
134+
binsum += sir[2]
135+
rsum += rinsum
136+
gsum += ginsum
137+
bsum += binsum
138+
stackpointer = (stackpointer + 1) % div
139+
sir = stack[stackpointer % div]
140+
routsum += sir[0]
141+
goutsum += sir[1]
142+
boutsum += sir[2]
143+
rinsum -= sir[0]
144+
ginsum -= sir[1]
145+
binsum -= sir[2]
146+
yi++
147+
x++
148+
}
149+
yw += w
150+
y++
151+
}
152+
x = 0
153+
while (x < w) {
154+
bsum = 0
155+
gsum = bsum
156+
rsum = gsum
157+
boutsum = rsum
158+
goutsum = boutsum
159+
routsum = goutsum
160+
binsum = routsum
161+
ginsum = binsum
162+
rinsum = ginsum
163+
yp = -radius * w
164+
i = -radius
165+
while (i <= radius) {
166+
yi = Math.max(0, yp) + x
167+
sir = stack[i + radius]
168+
sir[0] = r[yi]
169+
sir[1] = g[yi]
170+
sir[2] = b[yi]
171+
rbs = r1 - Math.abs(i)
172+
rsum += r[yi] * rbs
173+
gsum += g[yi] * rbs
174+
bsum += b[yi] * rbs
175+
if (i > 0) {
176+
rinsum += sir[0]
177+
ginsum += sir[1]
178+
binsum += sir[2]
179+
} else {
180+
routsum += sir[0]
181+
goutsum += sir[1]
182+
boutsum += sir[2]
183+
}
184+
if (i < hm) {
185+
yp += w
186+
}
187+
i++
188+
}
189+
yi = x
190+
stackpointer = radius
191+
y = 0
192+
while (y < h) {
193+
pix[yi] = -0x1000000 and pix[yi] or (dv[rsum] shl 16) or (dv[gsum] shl 8) or dv[bsum]
194+
rsum -= routsum
195+
gsum -= goutsum
196+
bsum -= boutsum
197+
stackstart = stackpointer - radius + div
198+
sir = stack[stackstart % div]
199+
routsum -= sir[0]
200+
goutsum -= sir[1]
201+
boutsum -= sir[2]
202+
if (x == 0) {
203+
vmin[y] = Math.min(y + r1, hm) * w
204+
}
205+
p = x + vmin[y]
206+
sir[0] = r[p]
207+
sir[1] = g[p]
208+
sir[2] = b[p]
209+
rinsum += sir[0]
210+
ginsum += sir[1]
211+
binsum += sir[2]
212+
rsum += rinsum
213+
gsum += ginsum
214+
bsum += binsum
215+
stackpointer = (stackpointer + 1) % div
216+
sir = stack[stackpointer]
217+
routsum += sir[0]
218+
goutsum += sir[1]
219+
boutsum += sir[2]
220+
rinsum -= sir[0]
221+
ginsum -= sir[1]
222+
binsum -= sir[2]
223+
yi += w
224+
y++
225+
}
226+
x++
227+
}
228+
toTransform.setPixels(pix, 0, w, 0, 0, w, h)
229+
return toTransform
230+
}
231+
}

0 commit comments

Comments
 (0)