前言
android-gpuimage虽然可以实现滤镜的效果,但遇到稍微复杂的需求,框架本身的bug和一些缺陷就暴露出来了,而且这个项目最后一个版本是1.4.1,已经2年没维护过了,提issues也没人讨论,这里总结一些遇到的问题和解决办法。
1、Demo跑起来就有些bug
android-gpuimage-support 重写了更友好的示例

2、异步调用getBitmapWithFilterApplied
有时候是黑色
在子线程调用getBitmapWithFilterApplied
,出来的bitmap是全黑的,但是在主线程就不会有问题。
预览设置的Filter对象跟生成的Filter需要是不同的对象,android-gpuimage-support 增加了GPUImageOutput
,可以更方便的输出Bitmap或文件。
这里示例RxJava2的调用方式,自定义Filter建议手动创建新对象然后setFilter
1 | new GPUImageOutput(gpuimage) |
3、RxJava的支持
使用android-gpuimage-support的GPUImageOutput
,添加了RxJava1和RxJava2的支持
1 | new GPUImageOutput(gpuImage) |
4、用TextureView来预览GPUImage的效果
android-gpuimage-support添加了支持GPUImage的TextureView
1 | <jp.co.cyberagent.android.gpuimage.view.GPUImageTextureView |
5、多次设置GPUImageFilterGroup
背景会出现错乱
当ScaleType
为CENTER_INSIDE
的时候,在使用GPUImageFilterGroup添加多个Filter的时候,首次setFilter(group)
不会有问题,再设置就会背景出现错乱(单个Filter不会出现这种情况)

暂时弄了2种办法:
1、ZongwenSun在 #395 提到在GPUImageFilter.onDraw
中添加GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);
,可以解决。
2、通过图片来动态改变View的宽高
1 | GPUImageTextureView textureView = new GPUImageTextureView(context); |
6、GPUImageFilterGroup
有时会出现IndexOutOfBoundsException
添加多个Filter后,频繁改变子Filter的属性,会导致GPUImageFilterGroup
的onDraw
方法内出现IndexOutOfBoundsException
。
猜测是线程问题,目前只能try-catch
掉,已经在android-gpuimage-support做相应处理,暂时没有找到更好的解决办法,。
7、GPUImageFilterGroup
出现ConcurrentModificationException
GPUImageFilterGroup里的Filter集合遍历都是用的foreach
,增删子Filter时就会出现此异常,换成for循环
即可。
已在android-gpuimage-support修复
8、改变GPUImageFilterGroup
子Filter属性不刷新
调用requestRender
没有刷新子Filter的效果,保险一点的办法是重新调用setFilter
9、GPUImageTwoInputFilter
让输入源不仅支持Bitmap还支持Filter
android-gpuimage-support提供了GPUImageTwoInputFilter2
,调用setSecondFilter(filter)
可以将滤镜作为输入源传入,需要注意的是要放一个GPUImageFilter在它的前面,否则可能回出现输入源的尺寸问题。
1 | GPUImageFilterGroup group=new GPUImageFilterGroup(); |
Related Issues not found
Please contact @xiandanin to initialize the comment