版权声明:本文为博主原创文章,未经博主同意不得转载。

https://blog.csdn.net/zoosenpin/article/details/30027263

1 原理分析
首先我们看一下Android系统默认拍照流程是怎么样子的,先上两幅图:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvem9vc2VucGlu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" />

图1 

图2
从上面两副图大概描写叙述一下Android是怎样拍照的:
1) 首先停止摄像头的预览功能,然后给摄像头发命令。进入拍照模式;
2) 假设摄像头自带ISP的。那么从摄像头出来的数据就是JPEG了。假设摄像头不带ISP。那么摄像头出来的数据是原始的。这样将原始数据再送给SOC的ISP编码处理并保存为文件;
3) 又一次启动Camera的预览。

为了弄清楚高速拍照的原理,以下我上一个Camera预览原理图:

图3
Camera预览是将摄像头输出图像数据不断的送往Overlay模块处理并叠加到LCD屏幕上,这里我就想了,既然预览是摄像头不断的输出数据。那么我就能够从预览帧中取一帧图像数据并编码保存为照片了,这不就能够了嘛!

但有一个问题是预览的分辨率可能非常小。而拍照的分辨率非常大。须要用软件把预览的图像进行放大。这样用户看到的照片就会造成图像失真。有马赛克的感脚。那怎么解决问题呢?事实上你能够变通一下,将预览的图像设置为最大分辨率进行预览,而拍照仅仅把最大分辨率预览的图像进行缩小,这样问题就好解多了。

从上面分析,修正后的快拍原理图例如以下:

图4
1) 摄像头进行最大分辨率预览;
2) 摄像头出来的图像数据流向一是送给Overlay模块缩小到适合屏幕显示。
3) 摄像头出来的图像数据流向二是送给2D GPU,2D GPU依照用户设置的拍照分辨率进行缩小,然后再送给ISP编码并保存为文件。

综上。我们仅仅要改动Android Camera Service和HAL就能够实现真正的高速拍照。

2 Abbreviations
ZSL:Zero Shutter Lag

iPhone 和 Galaxy高速拍照原理具体分析的更多相关文章

  1. 2019-2020-1 20199303<Linux内核原理与分析>第二周作业

    2019-2020-1 20199303第二周作业 1.汇编与寄存器的学习 寄存器是中央处理器内的组成部份.寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令.数据和位址.在中央处理器的控制部件中 ...

  2. 20169212《Linux内核原理与分析》课程总结

    20169212<Linux内核原理与分析>课程总结 每周作业链接汇总 第一周作业:完成linux基础入门实验,了解一些基础的命令操作. 第二周作业:学习MOOC课程--计算机是如何工作的 ...

  3. 20169212《Linux内核原理与分析》第二周作业

    <Linux内核原理与分析>第二周作业 这一周学习了MOOCLinux内核分析的第一讲,计算机是如何工作的?由于本科对相关知识的不熟悉,所以感觉有的知识理解起来了有一定的难度,不过多查查资 ...

  4. AJAX练习(一):制作可以自动校验的表单(从原理上分析ajax的作用)

    继上文(AJAX(一)AJAX的简介和基础)作为联系. 传统网页在注册时检测用户名是否被占用,传统的校验显然缓慢笨拙. 当ajax出现后,这种体验有了很大的改观,因为在用户填写表单时,签名的表单项已经 ...

  5. 20169210《Linux内核原理与分析》第二周作业

    <Linux内核原理与分析>第二周作业 本周作业分为两部分:第一部分为观看学习视频并完成实验楼实验一:第二部分为看<Linux内核设计与实现>1.2.18章并安装配置内核. 第 ...

  6. wp7之换肤原理简单分析

    wp7之换肤原理简单分析 纠结很久...感觉勉强过得去啦.还望各位大牛指点江山 百度找到这篇参考文章http://www.cnblogs.com/sonyye/archive/2012/03/12/2 ...

  7. 2018-2019-1 20189221 《Linux内核原理与分析》第九周作业

    2018-2019-1 20189221 <Linux内核原理与分析>第九周作业 实验八 理理解进程调度时机跟踪分析进程调度与进程切换的过程 进程调度 进度调度时机: 1.中断处理过程(包 ...

  8. 2018-2019-1 20189221 《Linux内核原理与分析》第八周作业

    2018-2019-1 20189221 <Linux内核原理与分析>第八周作业 实验七 编译链接过程 gcc –e –o hello.cpp hello.c / gcc -x cpp-o ...

  9. 2018-2019-1 20189221 《Linux内核原理与分析》第七周作业

    2018-2019-1 20189221 <Linux内核原理与分析>第七周作业 实验六 分析Linux内核创建一个新进程的过程 代码分析 task_struct: struct task ...

随机推荐

  1. 在 Ubuntu 里如何下载、安装和配置 Plank Dock

    一个众所周知的事实就是,Linux 是一个用户可以高度自定义的系统,有很多选项可以选择 —— 作为操作系统,有各种各样的发行版,而对于单个发行版来说,又有很多桌面环境可以选择.与其他操作系统的用户一样 ...

  2. 负载均衡,会话保持,session同步

    一,什么负载均衡 一个新网站是不要做负载均衡的,因为访问量不大,流量也不大,所以没有必要搞这些东西.但是随着网站访问量和流量的快速增长,单台服务器受自身硬件条件的限制,很难承受这么大的访问量.在这种情 ...

  3. kotlin for android----------MVP模式下(OKHttp和 Retrofit+RxJava)网络请求的两种实现方式

    今天要说的干货是:以Kotlin,在MVP模式下(OKHttp和 Retrofit+RxJava)网络请求两种实现方式的一个小案例,希望对大家有所帮助,效果图: Retrofit是Square公司开发 ...

  4. bzo1016: [JSOI2008]最小生成树计数

    现在给出了一个简单无向加权图.你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的最小生成树.(如果两颗最小生成树中至少有一条边不同,则这两个最小生成树就是不同的).由于不同的最小生成树 ...

  5. c++复习要点

    自增和自减运算符有前缀和后缀两种形式,都会改变对象,所以不能对常量对象操作. 前缀形式返回改变后的对象,返回*this. 后缀形式返回改变之前的值,所以必须创建一个代表这个值的独立对象并返回它,是通过 ...

  6. js Math对象的常用方法

    1,基本方法: Math.round();向上四舍五入. Math.ceil();向上取整,有小数就整数部分加1 Math.floor(5/2) ;向下取整 Math.abs();返回绝对值: Mat ...

  7. CodeForces 297C Splitting the Uniqueness (脑补构造题)

    题意 Split a unique array into two almost unique arrays. unique arrays指数组各个数均不相同,almost unique arrays指 ...

  8. Where do I belong

    先给数组排序,然后找到指定的值在数组的位置,最后返回位置对应的索引. 举例:where([1,2,3,4], 1.5) 应该返回 1.因为1.5插入到数组[1,2,3,4]后变成[1,1.5,2,3, ...

  9. vue 跨域

    注意!只能在本地调试使用,上线后url会出错使用以下方法要先引入网络模块 先配置文件:config =>index.js以下部分改为:proxyTable: { '/apis': { // 测试 ...

  10. Java复习4.数组初始化.

    Java复习4.Java中的数组声明方式  20131004 1.数组声明和初始化, 数组元素和变量一样,可以在定义的时候i进行初始化.数组元素的初始化工作实在编译阶段完成的,可以减少运行时间. 在初 ...