您的位置:首页 > 移动开发 > Android开发

android Camera 中添加一种场景模式

2013-04-22 11:32 197 查看
首先,来了解一下什么是场景模式。

最简单的方法当然是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<String> 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 配置项。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  camera android