Android Camera API ISO设置?

时间:2010-06-04 22:03:32

标签: android camera iso

有人知道从Android SDK中控制相机的ISO设置的位置吗?  应该可以,因为HTC Desire上的本机相机应用程序具有ISO设置。

5 个答案:

答案 0 :(得分:17)

您应该查看flatten()中的方法unflatten()get(String key)set(String key, String value)android.hardware.Camera.Parameters。 还要考虑source code of that class。它可能会使事情变得更清楚。

首先,你需要获得Camera.Parameters。将其展开为String并进行调查。我正在开发HTC Desire以及获得以下String

sharpness-max=30;zoom=0;taking-picture-zoom=0;zoom-supported=true;sharpness-min=0;sharpness=10;contrast=5;whitebalance=auto;jpeg-quality=100;preview-format-values=yuv420sp;jpeg-thumbnail-quality=75;preview-format=yuv420sp;preview-size=640x480;focal-length=3.53;iso=auto;meter-mode=meter-center;front-camera-mode=mirror;flash-mode-values=off,auto,on,torch;preview-frame-rate-values=15;preview-frame-rate=15;focus-mode-values=auto,infinity;jpeg-thumbnail-width=640;jpeg-thumbnail-size-values=640x480,512x384,384x288,0x0;zoom-ratios=100,114,131,151,174,200;saturation-def=5;preview-size-values=1280x720,800x480,768x432,720x480,640x480,576x432,480x320,400x240,384x288,352x288,320x240,272x272,240x240,240x160,176x144,160x120;smart-contrast=off;picture-size-values=2592x1952,2592x1456,2592x1936,2592x1728,2592x1552,2048x1536,2048x1360,2048x1216,2048x1152,1600x1200,1584x1056,1280x960,1280x848,1280x768,1280x720,1024x768,640x480,640x416,640x384,640x368,512x384,400x400,272x272;contrast-min=0;min-exposure-compensation=-4;brightness-min=0;antibanding=auto;taking-picture-zoom-min=0;saturation-min=1;contrast-max=10;vertical-view-angle=42.5;taking-picture-zoom-max=21;contrast-def=5;brightness-max=6;horizontal-view-angle=54.8;brightness=3;jpeg-thumbnail-height=480;cam-mode=0;focus-mode=auto;sharpness-def=10;front-camera-mode-values=mirror,reverse;picture-format-values=jpeg;saturation-max=10;max-exposure-compensation=4;exposure-compensation=0;exposure-compensation-step=0.5;flash-mode=off;effect-values=none,mono,negative,solarize,sepia,posterize,aqua;meter-mode-values=meter-average,meter-center,meter-spot;picture-size=2592x1952;max-zoom=5;effect=none;saturation=5;whitebalance-values=auto,incandescent,fluorescent,daylight,cloudy-daylight;picture-format=jpeg;brightness-def=3;iso-values=auto,deblur,100,200,400,800,1250;enable-caf=off;antibanding-values=off,50hz,60hz,auto

所以基本上有一个名为iso-values的密钥可以检索支持的值,还有一个密钥iso可以保存当前值。

您可以执行以下操作:

Camera cam = Camera.open();
Camera.Parameters camParams = cam.getParameters();
String supportedIsoValues = camParams.get("iso-values"); //supported values, comma separated String
camParams.set("iso", (String)newValue);
cam.setParameters(camParams);

参考unflattened参数,我会假设iso和曝光补偿设置之间存在差异。

答案 1 :(得分:9)

到目前为止(KK 4.4.2)android没有管理ISO的官方API ISO管理完全取决于设备,到目前为止我测试的8/18设备根本不支持ISO设置 调查Camera.getParameters().flatten()字符串以检查有效关键字,每个设备可以使用不同的关键字!!
大多数设备使用“iso-values”关键字来定义逗号分隔的可能值列表以与“iso”关键字一起使用,如下所示:

param.set("iso", valid_value_from_list);

其他一些设备使用“iso-mode-values”和“iso”关键字(Galaxy Nexus) 我还发现了一个使用“iso-speed-values”和“iso-speed”(Micromax A101)的设备 让我伤心的另一个是“nv-picture-iso-values” - > “nv-picture-iso”(LG双P990)。

关注如何使用这些关键字的szia答案。

以下是我使用已知关键字获取有效值列表的一些代码:

String flat = param.flatten();
String[] isoValues = null;
String values_keyword=null;
String iso_keyword=null;
if(flat.contains("iso-values")) {
    // most used keywords
    values_keyword="iso-values";
    iso_keyword="iso";
} else if(flat.contains("iso-mode-values")) {
    // google galaxy nexus keywords
    values_keyword="iso-mode-values";
    iso_keyword="iso";
} else if(flat.contains("iso-speed-values")) {
    // micromax a101 keywords
    values_keyword="iso-speed-values";
    iso_keyword="iso-speed";
} else if(flat.contains("nv-picture-iso-values")) {
    // LG dual p990 keywords
    values_keyword="nv-picture-iso-values";
    iso_keyword="nv-picture-iso";
}
// add other eventual keywords here...
if(iso_keyword!=null) {
    // flatten contains the iso key!!
    String iso = flat.substring(flat.indexOf(values_keyword));
    iso = iso.substring(iso.indexOf("=")+1);

    if(iso.contains(";")) iso = iso.substring(0, iso.indexOf(";"));

    isoValues = iso.split(",");

} else {
    // iso not supported in a known way
}

答案 2 :(得分:5)

因为我遇到了查找设备是否有ISO参数的相同问题,我查看了这个答案https://stackoverflow.com/a/23567103/3976589并看到@jc通过列出一些参数解决了8/18设备的问题他在不同的设备上找到了。根据该列表,我发现每个参数都包含单词isovalues有时仅包含这些单词,有时还包含其他内容)。

因此,如果我列出所有摄像机参数并搜索包含两个单词的字符串,我将知道ISO参数的名称是什么(如果存在)。此外,如果参数存在,我可以采用支持的ISO值,如果我想设置其中一个值,即更改相机参数,我可以删除{{1}末尾的-values参数,然后我可以成功更改iso-values值。

我现在将分享我的代码来执行此任务。首先是一个代码段,用于检索支持ISO值的列表。

ISO

此代码段仅列出支持的 private String ISOValuesParameter = null; private String ISOParameter = null; private String ISOValues = null; private void initCamera() { Camera mCamera = Camera.open(); // this will list supported values String ISOvalues = getISOValues(); textViewISO = (TextView) findViewById(R.id.viewISO); textViewISO.setText(ISOvalues); // setting Minimum ISO value if(ISOValuesParameter != null) { Camera.Parameters params = mCamera.getParameters(); ISOParameter = ISOValuesParameter.replace("-values", ""); params.set(ISOParameter, getMinISO()); mCamera.setParameters(params); // get the updated ISO value params = mCamera.getParameters(); String ISO = params.get(ISOParameter); Toast.makeText(this,"ISO set to: " + ISO, Toast.LENGTH_SHORT).show(); } } // returns a list with supported ISO values private String getISOValues() { ISOValuesParamter = getISOValuesParameter(); Camera.Parameters params = mCamera.getParameters(); ISOValues = params.get(ISOValuesParamter); return ISOValues!=null ? ISOValues : "ISO not supported"; } // this will return the name of the ISO parameter containing supported ISO values private String getISOValuesParameter() { Camera.Parameters params = mCamera.getParameters(); String flatten = params.flatten(); String[] paramsSeparated = flatten.split(";"); for(String cur : paramsSeparated) { if(cur.contains("iso") && cur.contains("values")) { return cur.substring(0,cur.indexOf('=')); } } return null; } 值。在我的应用程序中,我需要选择最低的ISO。这是我的解决方案:

ISO

此处private String getMinISO() { if(ISOValues == null) { return null; } String[] ISOarray = ISOValues.split(","); Arrays.sort(ISOarray, myComparator); String minISO = ISOarray[ISOarray.length-1]; return minISO; } 是一个比较两个字符串并按降序对数组进行排序的类。所有字母词都在开头,所有数字都在最后。这是我的实施:

myComparator

我希望我的回答有助于其他人。 :)

干杯! @ ee3509

答案 3 :(得分:4)

szias的回答是正确的。

String supportedIsoValues = camParams.get("iso-values"); 

在某些设备上返回null。

然而,您可以通过

设置iso
Camera cam = Camera.open();
Camera.Parameters camParams = cam.getParameters();
camParams.set("iso", "400"); // values can be "auto", "100", "200", "400", "800", "1600"
cam.setParameters(camParams);

我不知道所有设备是否支持“800”或“1600”

你可以查看你做了什么

String newVAlue = camParams.get("iso");

答案 4 :(得分:1)

请原谅我的无知,但这与通过setExposureCompensation()设置的“曝光补偿”有什么不同? Wikipedia有一些您可能会觉得有用的转换公式。