Skip to content

Commit 0b77d79

Browse files
authored
Create BlurUtils.kt
1 parent d254c4a commit 0b77d79

File tree

1 file changed

+230
-0
lines changed

1 file changed

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

0 commit comments

Comments
 (0)