【转】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***\mediatek\custom\project_name\hal\camera\camera\cfg_ftbl_custom_raw_main.h

 

[cpp] view plaincopy
 
  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出来看都支持哪些模式了。

 

[java] view plaincopy
 
  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 配置项。

 

posted @ 2015-12-25 10:56  牧之丨  阅读(934)  评论(0编辑  收藏  举报