使用android-gpuimage的一些问题总结

转载请注明出处:
http://blog.csdn.net/aa464971/article/details/80849383

前言

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

new GPUImageOutput(gpuimage)
		//.setFilter()//这里需要新创建的Filter
        .setFilterByClass(filter)//这里可以跟预览Filter用同一个对象
        .getFilterBitmap(GPUImageRxJava2Adapter.<Bitmap>create())
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(new SimpleLoadingDialogObserver<Bitmap>(v.getContext()) {
            @Override
            public void onNext(Bitmap bitmap) {
                super.onNext(bitmap);
            }
        });
3、RxJava的支持

使用android-gpuimage-supportGPUImageOutput,添加了RxJava1和RxJava2的支持

new GPUImageOutput(gpuImage)
        .setFilter(filter)
        .setOutputFormat(Bitmap.CompressFormat.JPEG)//输出格式
        .setQuality(80)//输出质量
        .setOutputFile(outputFile)
        .outputFilterBitmap(GPUImageRxJava2Adapter.<File>create())//这里可以切换RxJava1和RxJava2
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(new SimpleLoadingDialogObserver<File>(this) {
            @Override
            public void onNext(File file) {
                super.onNext(file);
                Toast.makeText(MainActivity.this, "保存成功->" + file.getAbsolutePath(), Toast.LENGTH_SHORT).show();
            }
        });
4、用TextureView来预览GPUImage的效果

android-gpuimage-support添加了支持GPUImage的TextureView

<jp.co.cyberagent.android.gpuimage.view.GPUImageTextureView
    android:id="@+id/texture"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
5、多次设置GPUImageFilterGroup背景会出现错乱

ScaleTypeCENTER_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的宽高

GPUImageTextureView textureView = new GPUImageTextureView(context);
textureView.setScaleType(GPUImage.ScaleType.VIEW_FIT_CENTER);
6、GPUImageFilterGroup有时会出现IndexOutOfBoundsException

添加多个Filter后,频繁改变子Filter的属性,会导致GPUImageFilterGrouponDraw方法内出现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在它的前面,否则可能回出现输入源的尺寸问题。

GPUImageFilterGroup group=new GPUImageFilterGroup();
group.addFilter(new GPUImageFilter());
group.addFilter(new GPUImageTwoInputFilter2());
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值