Android摄像头API ISO设置?

Android摄像头API ISO设置?,android,camera,iso,Android,Camera,Iso,有人知道在Android SDK中从何处控制摄像头的ISO设置吗? 这应该是可能的,因为HTC Desire上的本机相机应用程序具有ISO设置。请原谅我的无知,但这与通过setExposureCompensation()设置的“曝光补偿”有何不同?有一些你可能会发现有用的转换公式。你应该看看android.hardware.Camera.Parameters中的方法flatten(),get(String key),set(String key,String value)。 也考虑一下。这可能会

有人知道在Android SDK中从何处控制摄像头的ISO设置吗?
这应该是可能的,因为HTC Desire上的本机相机应用程序具有ISO设置。

请原谅我的无知,但这与通过setExposureCompensation()设置的“曝光补偿”有何不同?有一些你可能会发现有用的转换公式。

你应该看看
android.hardware.Camera.Parameters
中的方法
flatten()
get(String key)
set(String key,String value)
。 也考虑一下。这可能会让事情变得更清楚

首先,您需要获取
摄像机参数。将其展开为
字符串
,然后进行调查。我正在开发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
因此,基本上有一个名为
isovalues
的键来检索支持的值,还有一个保存当前值的键
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);

关于未调整的参数,我假设iso和曝光补偿设置之间存在差异。

szias的答案是正确的

只有

在某些设备上返回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");
到目前为止(KK 4.4.2),android还没有管理ISO的官方API。
ISO管理完全依赖于设备,目前为止我测试的8/18设备根本不支持ISO设置。
调查
Camera.getParameters().flant()
String以检查有效的关键字,每个设备可以使用不同的关键字
大多数设备使用“iso values”关键字定义可能与“iso”关键字一起使用的值的逗号分隔列表,如下所示:

param.set("iso", valid_value_from_list);
其他一些设备使用“iso模式值”和“iso”关键字(Galaxy Nexus)。
我还发现了一个使用“iso速度值”和“iso速度”的设备(Micromax A101)。
另一个让我伤心的是“nv图片iso值”->“nv图片iso”(LG dual P990)。

按照回答如何使用这些关键字

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

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
}

由于我在查找设备是否有
ISO
参数时遇到了同样的问题,我查看了这个答案,发现@j.c通过列出他在不同设备上找到的一些参数,解决了8/18设备的问题。根据该列表,我发现每个参数都包含单词
iso
值(有时仅包含这些单词,有时包含其他单词)

因此,如果我列出所有相机参数并搜索包含这两个词的字符串,我将知道
ISO
参数的名称(如果存在)。此外,如果参数存在,我可以获取支持的
ISO
值,如果我想设置其中一个值,即更改相机参数,我只需删除
ISO values
参数末尾的
-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
是一个比较两个字符串并按降序排序数组的类。所有字母单词都在开头,所有数字都在结尾。以下是我的实现:

// Singelton class
public class MyComparator implements  Comparator<String> {

private static MyComparator myComparator = null;

private MyComparator() {}

@Override
public int compare(String a, String b) {
    return compareString(a,b);
}

public static int compareString(String a, String b) {
    if (a.length() > b.length())
        return -1;
    if (a.length() == b.length()) {
        if (a.compareTo(b) > 0)
            return -1;
        else if (a.compareTo(b) == 0)
            return 0;
    }

    return 1;
}

public static synchronized MyComparator getInstance() {
    if(myComparator==null) {
        myComparator = new MyComparator();
    }

    return myComparator;
}

}
//Singelton类
公共类MyComparator实现了Comparator{
私有静态MyComparator MyComparator=null;
私有MyComparator(){}
@凌驾
公共整数比较(字符串a、字符串b){
返回比较器(a,b);
}
公共静态整数比较(字符串a、字符串b){
如果(a.length()>b.length())
返回-1;
如果(a.length()==b.length()){
如果(a.与(b)相比>0)
返回-1;
如果(a.与(b)==0相比)
返回0;
}
返回1;
}
公共静态同步MyComparator getInstance(){
if(myComparator==null){
myComparator=新的myComparator();
}
返回计数器;
}
}
我希望我的回答能帮助其他人。:)

干杯!
@ee3509

我不完全确定曝光设置是否能与iso设置获得相同的结果,这是可能的。但是,desire正在运行2.1,并且setExposureCompensation可用于API级别8,即2.2,因此在2.1中必须有其他方法来实现。谢谢你的回答。ISO是传感器灵敏度,曝光是图像曝光的时间。通常较长的曝光会导致照片更模糊但更亮,而较高的ISO值会导致照片更亮但更颗粒状。parameters.get(“ISO值”)在HTC上返回NULL。还有其他想法吗?@radhoo Desire应该支持ISO。请参阅下面我的答案,从camera.parameters.Flatte()检索有效ISO值(以及关键字)列表。作为参考,在我的两款手机(均为三星型号)上,可接受的值前缀为“ISO”,800在一款手机上可用,但不在两款手机上都可用,同时两者都不支持1600。ISO_关键字不应该是“ISO模式”而不是“ISO”吗谷歌银河nexus关键词?
// Singelton class
public class MyComparator implements  Comparator<String> {

private static MyComparator myComparator = null;

private MyComparator() {}

@Override
public int compare(String a, String b) {
    return compareString(a,b);
}

public static int compareString(String a, String b) {
    if (a.length() > b.length())
        return -1;
    if (a.length() == b.length()) {
        if (a.compareTo(b) > 0)
            return -1;
        else if (a.compareTo(b) == 0)
            return 0;
    }

    return 1;
}

public static synchronized MyComparator getInstance() {
    if(myComparator==null) {
        myComparator = new MyComparator();
    }

    return myComparator;
}

}