使用android-gpuimage的一些問題總結

轉載請註明出處:
http://blog.csdn.net/aa464971/article/details/80849383

前言

android-gpuimage雖然可以實現濾鏡的效果,但遇到稍微複雜的需求,框架本身的bug和一些缺陷就暴露出來了,而且這個項目已經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不會出現這種情況)

目前只能通過圖片來動態改變View的寬高,暫時沒有更好的解決辦法,已經在android-gpuimage-support 增加了ScaleType的類型

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());
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章