1. 前言
这段时间,在使用 natario1/CameraView 来实现带滤镜的预览
、拍照
、录像
功能。
由于CameraView
封装的比较到位,在项目前期,的确为我们节省了不少时间。
但随着项目持续深入,对于CameraView
的使用进入深水区,逐渐出现满足不了我们需求的情况。
特别是对于使用MultiFilter
,叠加2
个滤镜拍照是正常的,叠加2
个以上滤镜拍照,预览时正常,拍出的照片就会全黑。
Github
中的issues
中,也有不少提这个BUG
的,但是作者一直没有修复该问题。
首先,我们来明确CameraView
滤镜是如何调用的, 同时也让我们明确当遇到该问题时的代码大致情况,来复现下这个BUG
。
2. 前置操作
新建一个Android
项目,Activity
设为横屏,确保添加好相机相关权限,并申请权限后,依赖CameraView
的依赖库
implementation("com.otaliastudios:cameraview:2.7.2")
3. 编写XML布局
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MyMainActivity">
<com.otaliastudios.cameraview.CameraView
android:id="@+id/camera_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:cameraFacing="front"
app:cameraEngine="camera2"
app:cameraExperimental="true"
app:cameraMode="video" />
<ImageView
android:id="@+id/img"
android:layout_width="300dp"
android:layout_height="200dp" />
<Button
android:id="@+id/btn_take_picture"
android:layout_gravity="right|bottom"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="16dp"
android:text="拍照" />
</FrameLayout>
4. 初始化CameraView并添加滤镜
binding.cameraView.setLifecycleOwner(this)
val multiFilter = MultiFilter()
val contrastFilter = ContrastFilter()
contrastFilter.contrast = 1.05F
multiFilter.addFilter(contrastFilter)
val brightnessFilter = Filters.BRIGHTNESS.newInstance() as BrightnessFilter
brightnessFilter.brightness = 1.2F
multiFilter.addFilter(brightnessFilter)
val saturationFilter = Filters.SATURATION.newInstance() as SaturationFilter
saturationFilter.saturation = 1F
multiFilter.addFilter(saturationFilter)
binding.cameraView.filter = multiFilter
5. 进行拍照
binding.btnTakePicture.setOnClickListener {
//带滤镜拍照
binding.cameraView.takePictureSnapshot()
}
binding.cameraView.addCameraListener(object : CameraListener() {
override fun onPictureTaken(result: PictureResult) {
super.onPictureTaken(result)
//拍照回调
val bitmap = BitmapFactory.decodeByteArray(result.data, 0, result.data.size)
bitmap?.also {
Toast.makeText(this@Test2Activity, "拍照成功", Toast.LENGTH_SHORT).show()
//将Bitmap设置到ImageView上
binding.img.setImageBitmap(it)
val file = getNewImageFile()
//保存图片到指定目录
ImageUtils.save(it, file, Bitmap.CompressFormat.JPEG)
}
}
})
6. 运行程序
运行程序,点击拍照,我们就可以复现这个BUG
了 : 左上角的图片是拍照后全黑的效果。
7. 其他
7.1 CameraView源码解析系列
Android 相机库CameraView源码解析 (一) : 预览-CSDN博客
Android 相机库CameraView源码解析 (二) : 拍照-CSDN博客
Android 相机库CameraView源码解析 (三) : 滤镜相关类说明-CSDN博客
Android 相机库CameraView源码解析 (四) : 带滤镜拍照-CSDN博客
Android 相机库CameraView源码解析 (五) : 保存滤镜效果-CSDN博客
7.2 解决CameraViewBUG
Android 解决CameraView叠加2个以上滤镜拍照黑屏的BUG (一) : 复现BUG-CSDN博客
Android 解决CameraView叠加2个以上滤镜拍照黑屏的BUG(二) : 解决BUG-CSDN博客
为什么相机库CameraView预览和拍照的效果不一致 ?-CSDN博客