2010-06-04 13 views

risposta

1

Perdona la mia ignoranza, ma in che modo è diverso da "compensazione dell'esposizione" impostato tramite setExposureCompensation()? Wikipedia contiene alcune delle formule di conversione che potresti trovare utili.

+0

Non sono del tutto sicuro che se l'impostazione dell'esposizione otterrebbe gli stessi risultati con l'impostazione ISO, potrebbe essere possibile. Tuttavia il desiderio è in esecuzione 2.1 e setExposureCompensation è disponibile per il livello API 8 che è 2.2 Quindi ci deve essere un altro modo in 2.1 per farlo. Grazie per la risposta – ee3509

15

si dovrebbe dare un'occhiata a metodi flatten(), unflatten(), get(String key), set(String key, String value) in android.hardware.Camera.Parameters. Considerare anche lo source code of that class. Potrebbe rendere le cose più chiare.

Per prima cosa è necessario ottenere lo Camera.Parameters. Allontanalo a String e investigalo. Sto sviluppando su un HTC Desire, nonché un ottenere il seguente 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 

Quindi, in pratica c'è una chiave denominata iso-values per recuperare i valori supportati e una chiave iso che contiene il valore corrente.

È possibile effettuare le seguenti operazioni:

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

e con riferimento ai parametri unflattened Parto dal presupposto che c'è una differenza tra le impostazioni di compensazione ISO e di esposizione.

+0

parameters.get ("iso-values") restituisce NULL su HTC Desire. Altre idee? – radhoo

+0

@radhoo Desire dovrebbe supportare ISO. Vedere la mia risposta qui sotto per recuperare un elenco di valori ISO validi (e le parole chiave) da camera.parameters.flatten(). –

4

risposta szias è corretta.

Solo

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

rendimenti nulli su alcuni dispositivi.

Tuttavia è possibile impostare l'iso da

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

Io non so se "800" o "1600" è supportato su tutti i dispositivi

è possibile controllare quello che hai fatto per

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

Per riferimento, sui miei due telefoni (entrambi i modelli Samsung), i valori accettabili sono prefissati "ISO" e 800 è disponibile su uno, ma non entrambi, mentre nessuno dei due supporta 1600. – Jules

8

Ormai (KK 4.4.2) Android non ha API ufficiali per gestire ISO.
La gestione ISO è totalmente dipendente dal dispositivo e 8/18 dispositivi che ho provato finora non supportano affatto le impostazioni ISO.
Investigate Camera.getParameters().flatten() Stringa per verificare parole chiave valide, ogni dispositivo può utilizzare parole chiave diverse !!
La maggior parte dei dispositivi utilizzano "iso-valori" parola chiave per definire una virgola lista-dei-possibile-valori da utilizzare con "iso" parola chiave, in questo modo separato:

param.set("iso", valid_value_from_list); 

Alcuni altri dispositivi utilizza "iso-mode -values ​​"e" iso "keywords (Galaxy Nexus).
Ho trovato anche un dispositivo che utilizza "iso-velocità-valori" e "iso-velocità" (Micromax A101).
Un altro che mi rattrista è "nv-picture-iso-values" -> "nv-picture-iso" (LG dual P990).

Seguire szia risposta su come utilizzare queste parole chiave.

Ecco alcuni codice che utilizzo per ottenere un elenco di valori validi utilizzando parole chiave note:

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

Non dovrebbe essere iso_keyword "iso-mode" invece di "iso" per le parole chiave di Google Galaxy Nexus? – Thracian

4

da quando ho avuto lo stesso problema di trovare se il dispositivo è dotato di un parametro ISO ho guardato questa risposta https://stackoverflow.com/a/23567103/3976589 e sega che @jc aveva risolto il problema per i dispositivi 8/18 elencando alcuni parametri che aveva trovato su dispositivi diversi. In base a tale elenco ho trovato che ogni parametro contiene le parole iso e values (a volte solo quelle parole, a volte qualcosa di aggiuntivo).

Quindi, se elenco tutti i parametri della telecamera e cerco stringhe che contengono entrambe le parole, saprò qual è il nome del parametro ISO, se esiste. Inoltre, se il parametro esiste, posso prendere i valori supportati ISO e se voglio impostare uno di questi valori, ovvero modificare il parametro della telecamera, posso semplicemente rimuovere -values alla fine del parametro iso-values e quindi posso modificare correttamente il valore ISO .

Ora condividerò il mio codice per questa attività. Innanzitutto uno snippet che recupera un elenco con i valori supportati 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; 
    } 

Questo frammento elenca solo i supportati ISO valori. Nella mia applicazione avevo bisogno di scegliere l'ISO più basso. Qui è la mia soluzione:

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

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

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

    return minISO; 
} 

Qui myComparator è una classe che mette a confronto due stringhe e ordina l'array in ordine decrescente. Tutte le parole dell'alfabeto sono all'inizio e tutti i numeri sono alla fine. Ecco la mia implementazione:

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

} 

Spero che la mia risposta aiuti altre persone. :)

Cheers! @ ee3509

Problemi correlati