android Camera 中添加一种场景模式

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

最简单的方法当然是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

#if 1
    //  Scene Mode
    CONFIG_FEATURE(FID_SCENE_MODE, 
        BY_DEFAULT(SCENE_MODE_OFF), 
        SCENE_MODE_OFF,       SCENE_MODE_PORTRAIT,    SCENE_MODE_NORMAL, 
        SCENE_MODE_LANDSCAPE, SCENE_MODE_NIGHTSCENE,  SCENE_MODE_NIGHTPORTRAIT, 
        SCENE_MODE_THEATRE,   SCENE_MODE_BEACH,       SCENE_MODE_SNOW, 
        SCENE_MODE_SUNSET,    SCENE_MODE_STEADYPHOTO, SCENE_MODE_FIREWORKS, 
        SCENE_MODE_SPORTS,    SCENE_MODE_PARTY,       SCENE_MODE_CANDLELIGHT
    )
#endif

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

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

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

        if (sceneMode != null) {
            filterUnsupportedOptions(group,
                    sceneMode, mParameters.getSupportedSceneModes());
			List supportSceneMode = mParameters.getSupportedSceneModes();	 
			for (int i = 0; i < supportSceneMode.size(); i++) {
				Log.d(TAG, "supportSceneMode : " + i + " : " + supportSceneMode.get(i));
			}
        }


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 配置项。

你可能感兴趣的:(android,Camera)