2010-06-04 6 views
9

Würde jemand wissen, wo die ISO-Einstellung für die Kamera aus dem Android SDK zu steuern? Es sollte möglich sein, da die native Kamera-Anwendung auf dem HTC Desire ISO-Einstellungen hat.Android Kamera API ISO-Einstellung?

Antwort

1

Verzeihen Sie meine Unwissenheit, aber wie ist das anders als "Belichtungskorrektur" über setExposureCompensation() eingestellt? Wikipedia enthält einige der Umwandlungsformeln, die Sie möglicherweise nützlich finden.

+0

Ich bin mir nicht ganz sicher, ob die Belichtungseinstellung die gleichen Ergebnisse mit der ISO-Einstellung erzielen würde, könnte es möglich sein. Allerdings läuft der Wunsch 2.1 und die setExposureCompensation ist verfügbar für API-Ebene 8, die 2.2 ist Also muss es einen anderen Weg in 2.1, es zu tun. Danke für Ihre Antwort – ee3509

15

Sie flatten() einen Blick auf die Methoden nehmen sollte, unflatten(), get(String key), set(String key, String value) in android.hardware.Camera.Parameters. Beachten Sie auch die source code of that class. Es könnte die Dinge klarer machen.

Zuerst müssen Sie die Camera.Parameters erhalten. Unflatten Sie es auf String und untersuchen Sie es. Ich entwickle auf einem HTC Desire als auch eine der folgenden String erhalten:

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 

Also im Grunde ein Schlüssel iso-values genannt ist die unterstützten Werte und einen Schlüssel iso, die den aktuellen Wert hält abzurufen.

Sie folgendes tun:

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); 

Und mit Bezug auf die abgeflachte Parameter würde ich davon ausgehen, dass es einen Unterschied zwischen den Iso und Einstellungen für die Belichtungskorrektur.

+0

parameters.get ("ISO-Werte") gibt NULL auf einem HTC Desire zurück. Irgendwelche anderen Ideen? – radhoo

+0

@radhoo Desire sollte ISO unterstützen. Siehe meine Antwort unten, um eine Liste der gültigen ISO-Werte (und der Schlüsselwörter) von camera.parameters.flatten() abzurufen. –

4

Szias Antwort ist korrekt.

Nur

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

kehrt null auf einigen Geräten.

Dennoch können Sie die ISO-Set von

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); 

Ich weiß nicht, ob „800“ oder „1600“ auf allen Geräten unterstützt wird

können Sie überprüfen, was Sie von

tat
String newVAlue = camParams.get("iso"); 
+0

Zur Verweisung, auf meinen zwei Telefonen (beide Samsung-Modelle), die annehmbaren Werte sind vorangestellt "ISO", und 800 ist auf einem aber nicht beiden verfügbar, während keiner 1600 unterstützt. – Jules

8

Bis jetzt (KK 4.4.2) Android hat keine offiziellen APIs, um ISO zu verwalten.
Das ISO-Management ist eine völlig vom Gerät abhängige Angelegenheit, und 8/18 Geräte, die ich bisher getestet habe, unterstützen überhaupt keine ISO-Einstellungen.
Untersuchen Sie Camera.getParameters().flatten() String, um gültige Schlüsselwörter zu überprüfen, jedes Gerät kann andere Schlüsselwörter verwenden !!
Die meisten Geräte „iso-Werte“ Schlüsselwort verwenden eine durch Kommata getrennte Liste-of-möglich-Werte zu verwenden, mit „iso“ Schlüsselwort, wie diese zu definieren:

param.set("iso", valid_value_from_list); 

einige andere Geräte verwendet „iso-Modus -values ​​"und" iso "Schlüsselwörter (Galaxy Nexus).
Ich habe auch ein Gerät gefunden, das "iso-speed-values" und "iso-speed" (Micromax A101) verwendet.
Eine andere, die mich traurig machen ist "nv-Bild-Iso-Werte" -> "nv-Bild-iso" (LG Dual P990).

Folgen Sie szia beantworten, wie diese Schlüsselwörter verwenden.

Hier einige Code, den ich verwende, um eine Liste der gültigen Werte erhalten bekannte Schlüsselwörter:

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 
} 
+0

Sollte iso_keyword nicht "iso-mode" statt sein "iso" für google galaxy nexus keywords? – Thracian

4

da ich das gleiche Problem zu finden, hatte, wenn das Gerät einen ISO Parameter hat ich an dieser Antwort sah https://stackoverflow.com/a/23567103/3976589 und Säge dass @jc das Problem für 8/18 Geräte gelöst hat, indem es einige Parameter aufgelistet hat, die er auf verschiedenen Geräten gefunden hat. Basierend auf dieser Auflistung fand ich, dass jeder Parameter die Wörter iso und values (manchmal nur diese Wörter, manchmal etwas zusätzliches) enthält.

Also wenn ich alle Kameraparameter auflisten und nach Strings suchen, die beide Wörter enthalten, weiß ich, wie der Name des ISO-Parameters ist, falls er existiert. Außerdem kann ich, wenn der Parameter existiert, die unterstützten ISO Werte verwenden und wenn ich einen dieser Werte einstellen möchte, dh den Kameraparameter ändern, kann ich einfach den -values am Ende des iso-values Parameters entfernen und dann kann ich den ISO Wert erfolgreich ändern .

Ich werde jetzt meinen Code für diese Aufgabe teilen. Zuerst ein Ausschnitt, der eine Liste mit unterstützten Werten ISO abruft.

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; 
    } 

Dieser Code-Schnipsel nur listet die unterstützten ISO Werte. In meiner Anwendung musste ich die niedrigste ISO auswählen. Hier ist meine Lösung:

private String getMinISO() { 
    if(ISOValues == null) { 
     return null; 
    } 

    String[] ISOarray = ISOValues.split(","); 
    Arrays.sort(ISOarray, myComparator); 

    String minISO = ISOarray[ISOarray.length-1]; 

    return minISO; 
} 

Hier myComparator ist eine Klasse, die in absteigender Reihenfolge zwei Strings und sortiert das Array vergleicht. Alle Buchstaben sind am Anfang und alle Zahlen sind am Ende. Hier ist meine Implementierung:

// 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; 
} 

} 

Ich hoffe, meine Antwort hilft anderen Menschen. :)

Prost! @ ee3509