GPUImage图片滤镜处理的第三方开源库,对照IOS版的GPUImage写的,部分功能尚未完善,目前也有很多种滤镜,常用的滤镜基本上都有,请先浏览一遍github上面的用法。
依赖的库
1 | repositories { |
注意事项
一、图片变形
Android版目前没有IOS那么多类,那么多用法,我们用的最多的就是GPUImageView这个自定义view,继承的FrameLayout,并不是继承的ImageView,所以,它这里显示图片的时候,会有图片变形的问题。我的处理方法:
- 先用Glide获取图片的宽高
- 然后获取GPUImageView的LayoutParams,动态设置控件的宽高
二、内存溢出
- 图片过大造成的内存溢出,压缩图片,推荐使用鲁班压缩
- 频繁使用GPUImage获取Bitmap的getBitmapWithFilterApplied()方法,造成Bitmap过多的内存泄漏,推荐用WeakReference(弱引用)标记Bitmap,GC自动回收
- 显示大图和缩略图,一般都是一个大图和多种添加滤镜后的效果图(这个是缩略图),这里缩略图再通过getBitmapWithFilterApplied获取之前,最好吧原图按照规则缩小之后再获取显示,这样也能尽可能的减少内存的占用,点击缩略图显示大的效果图的时候,并不是改变bitmap,是给gpuIamgeView对象设置你点击目标图使用滤镜即可,这样也可以避免内存过多的消耗
三、滤镜添加
- 单一滤镜的添加
1 | //这里以添加黑白滤镜为例 |
- 组合滤镜的添加GPUImageFilterGroup
1 | GPUImageView gpuImageView = findViewById(R.id.img); |
- 多张图片的滤镜
1 | //这里以GPUImageTwoInputFilter为例(可以加到组合滤镜里面),它有多个子类 |
四、微调(敏感度问题)
只要构造方法,方法带参数的,都可以微调,这里微调的取值范围,Filter源码的类注释上面都有。如果,我们把seekBar的取值范围设置成类注释上面的范围,你滑动很小距离的seekBar,图片变化就会很大,所以,我们一般都是缩小范围再使用。
1 | //第一个参数seekBar是最大值,第二个参数是最小值,第三个参数是默认值,第四个参数是seekbar分几段 |
1 | //这里是最终设置的值 |
用法
上面的注意事项里面已经说了简单的用法了,怎么获取滤镜后的图片呢?
1 | //这个方法是获取bitmap对象,至于怎么保存,那就是你自己做了 |
1 | /** |
项目就不贴出来了。