Skip to content

Commit 0a3f115

Browse files
authored
Merge pull request cats-oss#434 from kitwtnb/add-zoom-blur-filter
Add zoom blur filter
2 parents 5833049 + 782f0d9 commit 0a3f115

File tree

3 files changed

+76
-2
lines changed

3 files changed

+76
-2
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ public override fun onCreate(savedInstanceState: Bundle?) {
198198
- [x] Box Blur
199199
- [x] Bilateral Blur
200200
- [ ] Motion Blur
201-
- [ ] Zoom Blur
201+
- [x] Zoom Blur
202202
- [ ] iOS Blur
203203
- [ ] Median Filter
204204
- [x] Swirl Distortion
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
package jp.co.cyberagent.android.gpuimage.filter;
2+
3+
import android.graphics.PointF;
4+
import android.opengl.GLES20;
5+
6+
public class GPUImageZoomBlurFilter extends GPUImageFilter {
7+
public static final String ZOOM_BLUR_FRAGMENT_SHADER = "" +
8+
"varying highp vec2 textureCoordinate;\n" +
9+
"\n" +
10+
"uniform sampler2D inputImageTexture;\n" +
11+
"\n" +
12+
"uniform highp vec2 blurCenter;\n" +
13+
"uniform highp float blurSize;\n" +
14+
"\n" +
15+
"void main()\n" +
16+
"{\n" +
17+
" // TODO: Do a more intelligent scaling based on resolution here\n" +
18+
" highp vec2 samplingOffset = 1.0/100.0 * (blurCenter - textureCoordinate) * blurSize;\n" +
19+
" \n" +
20+
" lowp vec4 fragmentColor = texture2D(inputImageTexture, textureCoordinate) * 0.18;\n" +
21+
" fragmentColor += texture2D(inputImageTexture, textureCoordinate + samplingOffset) * 0.15;\n" +
22+
" fragmentColor += texture2D(inputImageTexture, textureCoordinate + (2.0 * samplingOffset)) * 0.12;\n" +
23+
" fragmentColor += texture2D(inputImageTexture, textureCoordinate + (3.0 * samplingOffset)) * 0.09;\n" +
24+
" fragmentColor += texture2D(inputImageTexture, textureCoordinate + (4.0 * samplingOffset)) * 0.05;\n" +
25+
" fragmentColor += texture2D(inputImageTexture, textureCoordinate - samplingOffset) * 0.15;\n" +
26+
" fragmentColor += texture2D(inputImageTexture, textureCoordinate - (2.0 * samplingOffset)) * 0.12;\n" +
27+
" fragmentColor += texture2D(inputImageTexture, textureCoordinate - (3.0 * samplingOffset)) * 0.09;\n" +
28+
" fragmentColor += texture2D(inputImageTexture, textureCoordinate - (4.0 * samplingOffset)) * 0.05;\n" +
29+
" \n" +
30+
" gl_FragColor = fragmentColor;\n" +
31+
"}\n";
32+
33+
private PointF blurCenter;
34+
private int blurCenterLocation;
35+
private float blurSize;
36+
private int blurSizeLocation;
37+
38+
public GPUImageZoomBlurFilter() {
39+
this(new PointF(0.5f, 0.5f), 1.0f);
40+
}
41+
42+
public GPUImageZoomBlurFilter(PointF blurCenter, float blurSize) {
43+
super(NO_FILTER_VERTEX_SHADER, ZOOM_BLUR_FRAGMENT_SHADER);
44+
this.blurCenter = blurCenter;
45+
this.blurSize = blurSize;
46+
}
47+
48+
@Override
49+
public void onInit() {
50+
super.onInit();
51+
blurCenterLocation = GLES20.glGetUniformLocation(getProgram(), "blurCenter");
52+
blurSizeLocation = GLES20.glGetUniformLocation(getProgram(), "blurSize");
53+
}
54+
55+
@Override
56+
public void onInitialized() {
57+
super.onInitialized();
58+
setBlurCenter(blurCenter);
59+
setBlurSize(blurSize);
60+
}
61+
62+
public void setBlurCenter(final PointF blurCenter) {
63+
this.blurCenter = blurCenter;
64+
setPoint(blurCenterLocation, blurCenter);
65+
}
66+
67+
public void setBlurSize(final float blurSize) {
68+
this.blurSize = blurSize;
69+
setFloat(blurSizeLocation, blurSizeLocation);
70+
}
71+
}

sample/src/main/java/jp/co/cyberagent/android/gpuimage/sample/GPUImageFilterTools.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,8 @@ object GPUImageFilterTools {
113113

114114
addFilter("Bilateral Blur", FilterType.BILATERAL_BLUR)
115115

116+
addFilter("Zoom Blur", FilterType.ZOOM_BLUR)
117+
116118
addFilter("Transform (2-D)", FilterType.TRANSFORM2D)
117119

118120
addFilter("Solarize", FilterType.SOLARIZE)
@@ -301,6 +303,7 @@ object GPUImageFilterTools {
301303
FilterType.LEVELS_FILTER_MIN -> GPUImageLevelsFilter()
302304
FilterType.HALFTONE -> GPUImageHalftoneFilter()
303305
FilterType.BILATERAL_BLUR -> GPUImageBilateralBlurFilter()
306+
FilterType.ZOOM_BLUR -> GPUImageZoomBlurFilter()
304307
FilterType.TRANSFORM2D -> GPUImageTransformFilter()
305308
FilterType.SOLARIZE -> GPUImageSolarizeFilter()
306309
FilterType.VIBRANCE -> GPUImageVibranceFilter()
@@ -327,7 +330,7 @@ object GPUImageFilterTools {
327330
BLEND_DIFFERENCE, BLEND_DISSOLVE, BLEND_EXCLUSION, BLEND_SOURCE_OVER, BLEND_HARD_LIGHT, BLEND_LIGHTEN, BLEND_ADD, BLEND_DIVIDE, BLEND_MULTIPLY, BLEND_OVERLAY, BLEND_SCREEN, BLEND_ALPHA,
328331
BLEND_COLOR, BLEND_HUE, BLEND_SATURATION, BLEND_LUMINOSITY, BLEND_LINEAR_BURN, BLEND_SOFT_LIGHT, BLEND_SUBTRACT, BLEND_CHROMA_KEY, BLEND_NORMAL, LOOKUP_AMATORKA,
329332
GAUSSIAN_BLUR, CROSSHATCH, BOX_BLUR, CGA_COLORSPACE, DILATION, KUWAHARA, RGB_DILATION, SKETCH, TOON, SMOOTH_TOON, BULGE_DISTORTION, GLASS_SPHERE, HAZE, LAPLACIAN, NON_MAXIMUM_SUPPRESSION,
330-
SPHERE_REFRACTION, SWIRL, WEAK_PIXEL_INCLUSION, FALSE_COLOR, COLOR_BALANCE, LEVELS_FILTER_MIN, BILATERAL_BLUR, HALFTONE, TRANSFORM2D, SOLARIZE, VIBRANCE
333+
SPHERE_REFRACTION, SWIRL, WEAK_PIXEL_INCLUSION, FALSE_COLOR, COLOR_BALANCE, LEVELS_FILTER_MIN, BILATERAL_BLUR, ZOOM_BLUR, HALFTONE, TRANSFORM2D, SOLARIZE, VIBRANCE
331334
}
332335

333336
private class FilterList {

0 commit comments

Comments
 (0)