• android Camera 中添加一种场景模式


    转自:http://blog.csdn.net/fulinwsuafcie/article/details/8833652

    首先,来了解一下什么是场景模式。

    最简单的方法当然是google了,这里有一篇文章讲得比较通俗易懂。http://publish.it168.com/cword/2819.shtml 

    内容如下:

            一般而言,数码相机内预先调节好光圈、快门、焦距、测光方式及闪光灯等参数值,以便于那些经验不足的用户拍出有一定质量保证的数码相片。不过用现有的模式也未必能拍出高质量的照片。相当一部份朋友使用的是数码相机的AUTO(自动)模式,而在特定的拍摄环境中,其相片质量当然难以保障。因此为了更加方便初级用户的使用,数码相机厂商在数码相机内加入了数种场景模式,这样就更加方便拍出高质量的照片。目前,数码相机内的场景模式少则有四、五种,多则有二三十种。

    有些相机则是通过菜单来选择不同的场景模式


    以下最常见的八种模式:


        风景模式:拍摄风景名胜时,数码相机会把光圈调到最小以增加景深,另外对焦也变成无限远,使相片获得最清晰的效果。


        人像模式:用来拍摄人物相片,如证件照。数码相机会把光圈调到最大,做出浅景深的效果。而有些相机还会使用能够表现更强肤色效果的色调、对比度或柔化效果进行拍摄,以突出人像主体。


        夜景模式:夜景模式一般有两种,前者使用1/10秒左右的快门进行拍摄,从而有可能导致曝光不足。而后者则使用数秒长的快门曝光时间,以保证相片充分曝光,相片画面也会比较亮。上述两种都使用较小的光圈进行拍摄,同时闪光灯也会关闭。


        夜景人像模式:在夜景中拍摄人物(如逛灯会),数码相机通常会使用数秒至1/10秒左右的快门拍摄远处的风景,并使用闪光灯照亮前景的人物主体,闪光灯通常会在快闪关闭前被触发。


        动态模式(运动模式):用来拍摄高速移动的物体,数码相机会把快门速度调到较快(1/500秒),或提高ISO感光值。


        微距模式:用来拍摄细微的目标如花卉、昆虫等等,数码相机会使用“微距”焦距,并关闭闪光灯。


        逆光模式:在一些背光的环境下使用,即主体的背后有较强的光线。相机会采用重点测光以增强曝光的准确性、并增加EV值以避免主体过暗,有些相机还会使用闪光灯进行补光。


        全景模式:拍摄超宽幅度的画面(如山脉、大海)时,数码相机会在每张相片后留出多余位置,帮助摄影者连续拍摄多张风景相片,再组成一张超宽的风景照。

    现在智能手机的摄像头一般都在 5M, 8M, 12M, 高的都有 13M, 如 sony 的 Xperia™ ZL L35h 手机。可以媲美一般的卡片相机了。也有很多的参数可调,其中就包括了场景模式。

    MTK android 平台中,它的场景模式设置是写在 cfg_ftbl_custom_raw_main.h 文件中的。

    Location: ALPS.ICS***mediatekcustomproject_namehalcameracameracfg_ftbl_custom_raw_main.h

     1 #if 1  
     2     //  Scene Mode  
     3     CONFIG_FEATURE(FID_SCENE_MODE,   
     4         BY_DEFAULT(SCENE_MODE_OFF),   
     5         SCENE_MODE_OFF,       SCENE_MODE_PORTRAIT,    SCENE_MODE_NORMAL,   
     6         SCENE_MODE_LANDSCAPE, SCENE_MODE_NIGHTSCENE,  SCENE_MODE_NIGHTPORTRAIT,   
     7         SCENE_MODE_THEATRE,   SCENE_MODE_BEACH,       SCENE_MODE_SNOW,   
     8         SCENE_MODE_SUNSET,    SCENE_MODE_STEADYPHOTO, SCENE_MODE_FIREWORKS,   
     9         SCENE_MODE_SPORTS,    SCENE_MODE_PARTY,       SCENE_MODE_CANDLELIGHT  
    10     )  
    11 #endif  

    可以看到底层是支持了很多的场景模式的。需要哪个,写到这个表里面就可以。如我们需要添加一个 normal 模式,把 SCENE_MODE_NORMAL 写到这个表里面就可以了,当然这个也是需要 硬件支持的,需要先行查看一下该 sensor 是否支持该场景模式才行。

    完了之后编译,最后编译出来 libcamera.custom.so 库文件 push 到手机 system/lib 目录下面重启 mediaServer 即可支持该场景模式了。

    在上层可以通过在 CameraSettings.java 文件中的 initPreference 函数中添加如下代码,即可在上层打log出来看都支持哪些模式了。

     
    1      if (sceneMode != null) {  
    2          filterUnsupportedOptions(group,  
    3                  sceneMode, mParameters.getSupportedSceneModes());  
    4 List<String> supportSceneMode = mParameters.getSupportedSceneModes();    
    5 for (int i = 0; i < supportSceneMode.size(); i++) {  
    6     Log.d(TAG, "supportSceneMode : " + i + " : " + supportSceneMode.get(i));  
    7 }  
    8      }  

    log 显示如下:

    07-01 08:35:48.782 D/zpj     ( 3575): supportSceneMode : 0 : auto
    07-01 08:35:48.782 D/zpj     ( 3575): supportSceneMode : 1 : portrait
    07-01 08:35:48.782 D/zpj     ( 3575): supportSceneMode : 2 : normal
    07-01 08:35:48.782 D/zpj     ( 3575): supportSceneMode : 3 : landscape
    07-01 08:35:48.782 D/zpj     ( 3575): supportSceneMode : 4 : night
    07-01 08:35:48.782 D/zpj     ( 3575): supportSceneMode : 5 : night-portrait
    07-01 08:35:48.782 D/zpj     ( 3575): supportSceneMode : 6 : theatre
    07-01 08:35:48.783 D/zpj     ( 3575): supportSceneMode : 7 : beach
    07-01 08:35:48.783 D/zpj     ( 3575): supportSceneMode : 8 : snow
    07-01 08:35:48.783 D/zpj     ( 3575): supportSceneMode : 9 : sunset
    07-01 08:35:48.783 D/zpj     ( 3575): supportSceneMode : 10 : steadyphoto
    07-01 08:35:48.783 D/zpj     ( 3575): supportSceneMode : 11 : fireworks
    07-01 08:35:48.783 D/zpj     ( 3575): supportSceneMode : 12 : sports
    07-01 08:35:48.783 D/zpj     ( 3575): supportSceneMode : 13 : party
    07-01 08:35:48.783 D/zpj     ( 3575): supportSceneMode : 14 : candlelight

    如果需要添加菜单之类的,还需要修改到 app 中的 pref_camera_scenemode_key 配置项。

  • 相关阅读:
    VS2015快捷键
    layui radio 监听
    jsvascript === 和==的区别
    bootstrap table checkbox 根据值选中、禁用等
    table 中 display为 block 时 tbody 失去宽度
    打包成Zip
    Server.MapPath()用法
    JS比较当前时间是否在指定时间段内
    从多张表获取数据,重组DataTable,根据重组路径,打包下载文件。
    checkbox 根据值选中
  • 原文地址:https://www.cnblogs.com/zl1991/p/5203280.html
Copyright © 2020-2023  润新知