使用android-gpuimage的一些問題總結
前言
android-gpuimage雖然可以實現濾鏡的效果,但遇到稍微複雜的需求,框架本身的bug和一些缺陷就暴露出來了,而且這個專案已經2年沒維護過了,提issues也沒人討論,這裡總結一些遇到的問題和解決辦法。
1、Demo跑起來就有些bug
2、非同步呼叫getBitmapWithFilterApplied
有時候是黑色
在子執行緒呼叫getBitmapWithFilterApplied
,出來的bitmap是全黑的,但是在主執行緒就不會有問題。
預覽設定的Filter物件跟生成的Filter需要是不同的物件,android-gpuimage-support 增加了GPUImageOutput
這裡示例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-support的GPUImageOutput
,添加了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的效果
<jp.co.cyberagent.android.gpuimage.view.GPUImageTextureView
android:id="@+id/texture"
android:layout_width="match_parent"
android:layout_height="match_parent" />
5、多次設定GPUImageFilterGroup
背景會出現錯亂
當ScaleType
為CENTER_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的屬性,會導致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在它的前面,否則可能回出現輸入源的尺寸問題。
GPUImageFilterGroup group=new GPUImageFilterGroup();
group.addFilter(new GPUImageFilter());
group.addFilter(new GPUImageTwoInputFilter2());