解决相机库CameraView多滤镜拍照错乱的BUG (一) : 复现BUG

这篇具有很好参考价值的文章主要介绍了解决相机库CameraView多滤镜拍照错乱的BUG (一) : 复现BUG。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 前言

这段时间,在使用 natario1/CameraView 来实现带滤镜的预览拍照录像功能。
由于CameraView封装的比较到位,在项目前期,的确为我们节省了不少时间。
但随着项目持续深入,对于CameraView的使用进入深水区,逐渐出现满足不了我们需求的情况。
Github中的issues中,有些BUG作者一直没有修复。

那要怎么办呢 ? 项目迫切地需要实现相关功能,只能自己硬着头皮去看它的源码,去解决这些问题。
而这篇文章是其中关于CameraView在使用多滤镜MultiFilter的时候哦度会遇到拍照错乱的BUG

以下源码解析基于CameraView 2.7.2

implementation("com.otaliastudios:cameraview:2.7.2")

为了在博客上更好的展示,本文贴出的代码进行了部分精简

解决相机库CameraView多滤镜拍照错乱的BUG (一) : 复现BUG,bug,android,相机库,CameraView,拍照,多滤镜,错乱

2. 复现BUG

2.1 添加权限

AndroidManifest.xml中添加权限

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />

别忘了申请权限

ActivityCompat.requestPermissions(
    this,
    arrayOf(
        android.Manifest.permission.CAMERA,
        android.Manifest.permission.RECORD_AUDIO,
        android.Manifest.permission.WRITE_EXTERNAL_STORAGE
    ),
    1
)

2.2 在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="back"
        app:cameraEngine="camera2"
        app:cameraExperimental="true"
        app:cameraMode="picture" />

    <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>

2.3 实现Activity

Activity中添加如下代码

class CameraActivity : AppCompatActivity() {
    private lateinit var binding: ActivityTest2Binding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        binding = ActivityTest2Binding.inflate(layoutInflater)
        setContentView(binding.root)

        //TODO 申请权限,这里略过,详见上文

        binding.btnTakePicture.setOnClickListener {
            //调用带滤镜拍照
            binding.cameraView.takePictureSnapshot()
        }

        binding.cameraView.addCameraListener(object : CameraListener() {
            override fun onPictureTaken(result: PictureResult) {
                super.onPictureTaken(result)
                //拍照回调
                val res = BitmapFactory.decodeByteArray(result.data, 0, result.data.size)
                res?.also {
                    val file = getNewImageFile()
                    ImageUtils.save(it, file, Bitmap.CompressFormat.JPEG)
                }
            }
        })
        //初始化CameraView
        binding.cameraView.setLifecycleOwner(this)
        val multiFilter = MultiFilter()
        val crossProcess = Filters.CROSS_PROCESS.newInstance()
        multiFilter.addFilter(crossProcess)
        //设置滤镜
        binding.cameraView.filter = multiFilter
    }
}

2.4 运行项目

接着运行项目,预览时正常的,点击拍照,可以发现,带滤镜拍出来的图片是正常的。

解决相机库CameraView多滤镜拍照错乱的BUG (一) : 复现BUG,bug,android,相机库,CameraView,拍照,多滤镜,错乱

2.5 使用两个滤镜

然后我们改成使用两个滤镜

//初始化CameraView
binding.cameraView.setLifecycleOwner(this)
val multiFilter = MultiFilter()
val crossProcess = Filters.CROSS_PROCESS.newInstance()
multiFilter.addFilter(crossProcess)
val vignette = Filters.VIGNETTE.newInstance()
multiFilter.addFilter(vignette)
//设置滤镜
binding.cameraView.filter = multiFilter

默认情况下,CameraView会使用摄像头支持的最大像素进行拍照,我这个手机CameraView最终选用的摄像头分辨率是3072x4096,而我的手机屏幕分辨率是1080*2412(也就是CameraView的分辨率),预览时候是正常的,拍出来的照片居然放大了 ?

解决相机库CameraView多滤镜拍照错乱的BUG (一) : 复现BUG,bug,android,相机库,CameraView,拍照,多滤镜,错乱

2.6 使用1080P

我们再将CameraView拍照的分辨率强制指定为1920*1080,而我的手机屏幕分辨率是1080*2412,预览也是正常的,这个时候拍出来的照片却是比实际尺寸缩小的。

解决相机库CameraView多滤镜拍照错乱的BUG (一) : 复现BUG,bug,android,相机库,CameraView,拍照,多滤镜,错乱

3. BUG小结

至此,我们可以总结这个BUG,是跟CameraView的尺寸和摄像头选取的分辨率匹配有关。

  • 使用单个滤镜
    • 一切正常
  • 使用多个滤镜,预览正常,但是
    • 手机选用的摄像头分辨率比CameraView分辨率高 : 照片得到的画面会放大
    • 手机选用的摄像头分辨率比CameraView分辨率低 : 拍照得到的画面会缩小,会有黑边

那这到底是为什么呢 ? 又该怎么解决呢 ?
我们在下一篇文章中做详细分析 : 解决相机库CameraView多滤镜拍照错乱的BUG (二) : 解决BUG

4. 其他

4.1 CameraView源码解析系列

Android 相机库CameraView源码解析 (一) : 预览-CSDN博客
Android 相机库CameraView源码解析 (二) : 拍照-CSDN博客
Android 相机库CameraView源码解析 (三) : 滤镜相关类说明-CSDN博客
Android 相机库CameraView源码解析 (四) : 带滤镜预览-CSDN博客
Android 相机库CameraView源码解析 (五) : 带滤镜拍照-CSDN博客
Android 相机库CameraView源码解析 (六) : 保存滤镜效果-CSDN博客文章来源地址https://www.toymoban.com/news/detail-773426.html

到了这里,关于解决相机库CameraView多滤镜拍照错乱的BUG (一) : 复现BUG的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android11 相机拍照权限,以及解决resolveActivity返回null

    一、配置拍照和读写权限 二、手动申请权限         implementation \\\'com.permissionx.guolindev:permissionx:1.4.0\\\'         1、手动申请读写,拍照权限         2、手动申请文件管理权限 三、Manifest中配置queries(解决resolveActivity为null) 四、Manifest中配置provider 五、配置file_paths文件

    2024年02月15日
    浏览(52)
  • 成功解决BUG:OSError: [Errno 9] Bad file descriptor(Python BUG)

    成功解决BUG:OSError: [Errno 9] Bad file descriptor 在 Python 代码编写过程中,会出现如下错误: OSError: [Errno 9] Bad file descriptor 该错误翻译为中文是: 将一个无效的文件句柄(-1)传递给 os.close() 函数,它试图关闭该文件句柄。 由于该文件句柄无效,会引发TypeError,错误消息将显示为

    2024年02月12日
    浏览(37)
  • Java常见Bug解决方案

    刚开始学习Java语言的小伙伴, 很可能被各种各样的程序bug搞得焦头烂额, 甚至被劝退。别怕,健哥将手把手带你了解Java中的异常体系, 如何识别Bug以及如何解决Bug。 让我们先来了解下Java中的异常分类, 如下图: Java中的异常分为Error错误和Exception异常两大类 Error错误 : 一般所有

    2024年02月13日
    浏览(36)
  • 【Python BUG】CondaHTTPError解决记录

    CondaHTTPError: HTTP 429 TOO MANY REQUESTS for url https://mirrors.ustc.edu.cn/anaconda/pkgs/free/win-64/current_repodata.json Elapsed: 00:26.513315 找到用户路径下的 .condarc 文件,建议用这个方法前和我一样做个备份,方法不行的话可以恢复之前状态,不至于改的乱七八糟。 使用编辑器打开文件,将里面内容

    2024年04月10日
    浏览(36)
  • git常见bug及其解决方案

    git status 查看状态中是否有效忽略了 git add命令主要用于把我们要提交的文件的信息添加到索引库中;git commit命令是git将依据索引库中的内容来进行文件的提交。 git add -u []: 把中所有tracked文件中被修改过或已删除文件的信息添加到索引库。它不会处理untracted的文件。 git add

    2024年02月05日
    浏览(53)
  • 修复所有 bug 并不能解决所有问题

    原文:jeffpsherman - 2024.04.08 在软件领域,如同在制造业,有些问题是由于 bug 或“特殊原因”引发的,而有些则是“常见原因”,这是由于系统设计和实现的性质所导致的。修复 bug 就是移除特殊原因,消除 bug 可以极大地提升软件质量,但它并不会影响“常见原因”问题。 我

    2024年04月28日
    浏览(41)
  • Linux驱动bug及解决方法记录

    记录一下自己驱动开发遇到的bug以及解决方法,如有错误欢迎指正。 1.遇到 insmod: ERROR: could not insert module xxx.ko: File exists ,一般是重复加载的问题,只需要 rmmod 卸载掉,再重新 insmod 加载即可解决。 2.遇到 insmod: ERROR: could not insert module xxx.ko: Operation not permitted ,一般是加载的

    2024年02月13日
    浏览(45)
  • 【BUG】Nginx转发失败解决方案

    最近在做项目的时候出现了一个问题,琢磨了好久,来浅浅记录一下。 这个项目后端使用的是gateway网关和nacos实现动态的路由,前端使用nginx来管理前端资源,大体流程:浏览器发起请求,经过nginx代理,转到gateway网关服务上,然后gateway根据路径,动态得路由到各个服务。

    2024年02月07日
    浏览(50)
  • mmdetection3.1.0 bug(已解决)

    mmdetection版本3.1.0 想这训练rpn网络,但是训练后val的时候出现了问题,根据Traceback,找到bug。 报错信息 :ValueError: setting an array element with a sequence. The requested array has an inhomogeneous shape after 1 dimensions. The detected shape was (102,) + inhomogeneous part. 解决方法 :np.array(all_ious)改为np.array

    2024年04月29日
    浏览(33)
  • visual studio解决bug封装dll库

    配置属性/常规/输出目录 链接器/常规/输出dll文件 链接器/调试/输出程序数据库pdb文件 链接器/高级/导入库 然后修改更新说明 更新说明格式如下: 4.将库提交到FTP每日更新库文档下 和测试交接、提交解决禅道bug

    2024年02月07日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包