Android:Camera1/Camera2预览滤镜渲染和拍照后的图像滤镜渲染-我自己的学习日记(建议直接翻到最底部看如何操作)

Camera/Camera2预览渲染和拍照后的图像渲染


题外话:最开始我用的是Camera包,因领导要求,我才使用的Camera2包,这两个包是天差地别!!!千万不能拿Camera的思维去写Camera2。Camera2是我最近才重构的,使用时可能问题比较大。
Camera1和Camera2是两个完全不一样的东西!!!
Camera1和Camera2是两个完全不一样的东西!!!
Camera1和Camera2是两个完全不一样的东西!!!

我这是在公司开发的所以不能放源码,只能写个思路!!!!
这算是我今天4月份实习期时的一份小笔记吧,因为最近(7月)项目又双叒叕重构了,来写一下我是怎么完成的😀。
我今年实习的时候做的项目,不方便贴源码,但可以在这里分享一下制作过程。

那么我先从Camera开始说起:

  1. Camera+Sureface:直接上链接吧
    Sureface不支持预览内容可随旋转变换而变化哦!所以得换
    当我跑起来的时候,此时需要可预览、手势操作(平移,旋转,缩放)和拍照后,带我入门的帅气小哥(师傅)看我的呈现画面需要手势操作即推荐我用TextureView,我重构成了↓

  2. Camera+TextureView:直接上链接吧
    TextureView支持预览内容可随旋转变换而变化。
    当我跑起来的时候且完成了预览、手势操作和拍照,此时需要预览渲染的预览方式,我又重构成了↓

  3. Camera+GLSurfaceView:直接上链接吧,但这仅仅是完成预览
    当我需要完成预览渲染不得不用到GLSurfaceView,因为需要渲染预览画面,所以需要OPENGL ES2.0(很复杂,这玩意太多东西要记了,我也优点云里雾里的)了,此时我再基础上完善成了↓

  4. Camera+GLSurfaceView并完成画面渲染:直接上链接吧
    这篇是来渲染MediaPlayer的,可以自己改成Camera,自己操作吧很简单的换几个代码的事,此时图像渲染的问题就大功告成啦。!!!此时我发现GLSurfaceView的旋转的方法为gl.glRotatef(angle, x, y, z)有部分延迟,有点不太优秀,用过就知道啦,缩放和平移的手势就没有问题了。
    !!!以上是仅仅完成了对GLSurfaceView画布的预览渲染,并没有完成拍照出来的图像也被渲染(拍照出来的图是依旧是原图)。

正值7月酷暑,我得从Camera2开始说起了:

  • Camera2+Sureface:Sureface与我要有的旋转手势不符,我就没尝试了

  • 7-13更新: Camera2+TextureView: 百度一抓一大把,我完成了预览、手势和拍照。
    此时的我重构完,发现这个Camera2自带这些预览渲染啊wocao!!!(http://www.chinaoc.com.cn/p/1221429.html)贼开心,信誓旦旦的说我可以尽快交出升级后的项目了,但我发现这些API不知道为什么基本是无效的… 给我整懵了,我搜了资料,又下了十几分demo都是无效的,所以又到重构的时间了↓

  • 7-18更新:直到我找到了 GPUImage ,差点都快哭了出来,又是符合Camera2开发,又是可以预览渲染也能画面拍出来渲染!!!
    目前正在重构中!!!(旋转还是有点问题,我再想想办法,最简单的办法就是和领导提要求:能不能不要旋转哈哈哈哈哈哈,那当然是不可能的啦)

  • 7-21更新:项目合并完了!!GPUimage Demo的图像输出的大小是当前GPIImageView的长宽,这demo中分别有这亮度,饱和,色温的滤镜,现在搞一个新的滤镜:将亮度,饱和,色温这三个值控制成的滤镜变为一个,正在查资料…令人脑壳痛的着色器语言

  • 7-22更新:在GPUimage基础上配合使用了 颜色矩阵(ColorMatrix) 和glsl语言来 并且使用了三个值来写出了新的滤镜了~ 代码有空上班的时候再放,具体也是参照之前的:直接上链接吧,现在还是要搞最开始的旋转问题了 真是脑壳疼

以上基本都能准确实现滤镜功能了,以下的更新是要适配手指触控旋转的一份更新。

  • 7-31更新:这几天都忙别的项目,抽空在找摄像头内容的旋转。终于可以来最后一次更新这篇文章了哈哈哈哈!GLSurfaceView的setRotate()与GLTextureView的的setRotate()是两个东西,而我一直在用GLSurfaceView的,并且GPUimage的包是默认使用GLSurfaceView的所以很头疼这玩意怎么改成GLTextureView,今天闲着没事干在看UI里的一些东西 突然看到一行: app:gpuimage_surface_type="texture_view"
    看到这一行东西,我知道我找了这么久的问题终于解决了,现在去修改一下就完事了
  • 那么每次都希望我不要再回来添加重构并更新该文章了
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 使用 camera2 API 可以更加灵活、可定制和高效地完成 Android 相机应用开发,其相比 camera1 API 的性能有大幅提升。 在使用 camera2 API 完成预览拍照前,需要进行以下几个步骤: 1. 获取 CameraManager 对象,查找可用的摄像头列表,并选择需要打开的摄像头。 2. 创建 CameraCaptureSession 对象,用于处理相机触发器的请求,并连接 CameraDevice 和 Surface。 3. 匹配预览和图片输出的 Surface,设置相应的尺寸和格式。 4. 创建 CaptureRequest 对象,设置相应的参数,如自动对焦模式、曝光模式等。 5. 使用 CameraCaptureSession 进行预览拍照。 在预览时,可以使用 TextureView 或 SurfaceView 进行实时数据渲染,比如显示相机预览画面、拍照后处理和显示等,同时可以通过设置监听器动态获取相机输出的图像流数据。 在拍照时,需要创建 ImageReader 对象,设置输出数据的格式和尺寸,同时需要建立对应的 Surface,将其传入 CaptureRequest.Builder,设置请求类型并发起拍照请求。通过设置 ImageReader 的 OnImageAvailableListener 接口,即可接收到图片数据,并进行后续处理和保存。 以上是使用 camera2 API 完成预览拍照的基本流程,实际开发中需要根据具体需求进行优化和调整。 ### 回答2: Android Camera2 API 是 Android 系统中相机功能的一种全新的 API,使用 Camera2 可以更灵活地操作相机设备并获得更高质量的照片。 使用 Camera2 实现预览非常简单,我们只需要实现一个 CameraDevice.StateCallback 接口实现类和一个 SurfaceView 主界面。在 StateCallback 的 onOpened 回调中获得 CameraDevice 的实例,然后通过 ImageReader 创建 SurfaceHolder,最后将 SurfaceHolder 通过 CameraDevice.createCaptureSession 接口跟 CameraDevice 进行绑定即可实现预览拍照的实现过程与预览类似,首先获得 CameraDevice 实例,然后创建一个 CaptureRequest.Builder 对象,将拍照设置参数通过 CaptureRequest.Builder.set 方法设置到 CaptureRequest.Builder 对象中,最后通过 CameraCaptureSession.capture 接口启动拍照操作即可。 当然,在使用 Camera2 API 进行操作相机时,还需要注意一些其他问题,比如不同的相机设备有不同的特性,需要针对不同的设备进行优化和适配,还需要保证应用的流畅性和稳定性,以达到更好的用户体验。 总之,使用 Camera2 API 实现预览拍照Android 开发的一个重要技能,需要开发者深入了解该 API 的机制和使用方式,才能更好地实现优秀的相机应用。 ### 回答3: Android中的camera2是一种相机应用程序接口(API),旨在提高相机应用程序的功能和性能。相较于早期版本的camera API,camera2 API提供了更多的控制选项,允许开发者定制相机应用程序的功能,从而实现更好的用户体验。 使用camera2 API实现预览拍照需要以下步骤: 1. 获取CameraManager对象。使用该对象可以获取系统中可用的相机列表,并在需要的时候打开指定相机。 2. 打开指定相机。调用CameraManager.openCamera()方法打开相机。 3. 创建CaptureSession。CaptureSession是与相机关联的一组输出Surface的集合。 4. 创建CaptureRequest。CaptureRequest是一个指定相机操作和设置的重要对象,可以通过它来设置各种模式、参数和目标Surface。 5. 创建Preview Request。处理预览界面。 6. 启动相机预览。启动前,可以使用CaptureRequest.Builder设置其他预览参数。 7. 拍照。当用户点击拍照按钮时,调用CaptureSession.capture()方法,即可拍照并接收回调。 8. 关闭相机。释放所有占用的资源,以便其他应用程序可以使用相机。 总之,在使用camera2 API实现预览拍照时,需要使用许多类和方法。但只要开发者掌握了API中的基本概念和流程,就可以自由地使用该API,设计新型的相机应用程序,提供更好的功能和性能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值