Android SDK からカメラの ISO 設定を制御する場所を知っている人はいますか? HTC Desire のネイティブ カメラ アプリケーションには ISO 設定があるため、可能なはずです。
5 に答える
デバイスにパラメーターがあるかどうかを見つけるという同じ問題があったので、ISO
この回答https://stackoverflow.com/a/23567103/3976589を見て、@ jc がいくつかのパラメーターをリストすることで 8/18 デバイスの問題を解決したことを確認しました彼がさまざまなデバイスで見つけたもの。そのリストに基づいて、各パラメーターにiso
andという単語が含まれていることがわかりましたvalues
(それらの単語のみ、場合によっては追加の何か)。
したがって、すべてのカメラ パラメーターを一覧表示し、両方の単語を含む文字列を検索すると、ISO
パラメーターの名前があればわかります。さらに、パラメーターが存在する場合は、サポートされているISO
値を取得できます。これらの値のいずれかを設定したい場合、つまりカメラ パラメーターを変更したい場合-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
2 つの文字列を比較し、配列を降順に並べ替えるクラスを次に示します。すべてのアルファベットの単語が最初にあり、すべての数字が最後にあります。これが私の実装です:
// 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;
}
}
私の答えが他の人に役立つことを願っています。:)
乾杯!@ee3509
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");
無知で申し訳ありませんが、これは setExposureCompensation() で設定された「露出補正」とどう違うのでしょうか? ウィキペディアには、役に立つと思われる変換式がいくつかあります。