• R/O
  • HTTP
  • SSH
  • HTTPS

nyartoolkit-and: Commit

NyARToolkit for Android v2.x, 3.x mainline.

master: NyARToolkit core.
android-1.6: for Android 1.6. obsolete version.
android-2.2: for Android 2.2. current version.


Commit MetaInfo

Revision5867a2f51c2dea84453edd86f2f428290c11f626 (tree)
Time2012-05-26 23:00:25
Authornyatla <nyatla39@gmai...>
Commiternyatla

Log Message

rollback to a3da5d5

Change Summary

Incremental Difference

--- a/NyARToolKit for Android - Base/src/jp/androidgroup/nyartoolkit/camera/CameraPreview.java
+++ b/NyARToolKit for Android - Base/src/jp/androidgroup/nyartoolkit/camera/CameraPreview.java
@@ -35,13 +35,29 @@
3535 package jp.androidgroup.nyartoolkit.camera;
3636
3737 import java.io.IOException;
38+import java.util.List;
3839
3940 import android.content.Context;
4041 import android.hardware.Camera;
42+import android.hardware.Camera.Size;
4143 import android.util.Log;
4244 import android.view.SurfaceHolder;
4345 import android.view.SurfaceView;
4446
47+/**
48+ * カメラキャプチャを制御するクラス
49+ *
50+ * 4:3 固定で、320x240 ~ 640x480 の範囲内で許容される最小サイズでキャプチャするような
51+ * アルゴリズムが実装されている。これは、大きい画面ほど処理の負荷が高くカクカクになってしまうため。
52+ * デュアルコアが搭載されている端末であれば、800x600より一回り小さいサイズまで耐えられそう。
53+ *
54+ * 画面比の問題があるため、基本的には 4:3 固定で使用すること。
55+ * カメラパラメータファイルを準備して 16:9 にすることも可能ではあるが、その場合は、 desireWitdh、Height を、
56+ * 指定の比率に書き換えて使用してください。
57+ * 必要に応じて、setter を作って、new したタイミングで、画面サイズに合わせて書き換える処理を入れてもいいと思います。
58+ *
59+ * 書き換える際は、ソースコードをよく読んで、用法を間違えずにご利用ください。
60+ */
4561 public class CameraPreview extends SurfaceView
4662 implements SurfaceHolder.Callback, Camera.PreviewCallback
4763 {
@@ -56,6 +72,26 @@ public class CameraPreview extends SurfaceView
5672 private Camera camera;
5773
5874 /**
75+ * 設定可能なキャプチャ映像の最小幅
76+ */
77+ private int minDesiredWidth = 320;
78+
79+ /**
80+ * 設定可能なキャプチャ映像の最小高さ
81+ */
82+ private int minDesiredHeight = 240;
83+
84+ /**
85+ * (上限)キャプチャ映像の幅
86+ */
87+ private int maxDesiredWidth = 640;
88+
89+ /**
90+ * (上限)キャプチャ映像の高さ
91+ */
92+ private int maxDesiredHeight = 480;
93+
94+ /**
5995 * 設定したいキャプチャ映像の幅
6096 */
6197 private int desiredWidth = 320;
@@ -141,11 +177,45 @@ public class CameraPreview extends SurfaceView
141177 return;
142178 }
143179
180+ // 許容される比率の最低値
181+ final double ASPECT_TOLERANCE = 0.05;
182+ double targetRatio = (double) minDesiredWidth / minDesiredHeight;
183+
144184 // カメラの設定を取得する
145185 Camera.Parameters parameters = camera.getParameters();
146186
147- // 取得した設定を書き換える
148- parameters.setPreviewSize(desiredWidth, desiredHeight);
187+ // 適応サイズ有無確認フラグ
188+ boolean _isFoundCapSize = false;
189+
190+ // キャプチャサイズ初期化
191+ captureWidth = maxDesiredWidth;
192+ captureHeight = maxDesiredHeight;
193+
194+ // カメラのキャプチャサイズのリストを取得
195+ List<Size> sizes = parameters.getSupportedPreviewSizes();
196+
197+ // 適切なサイズはどれかな?
198+ for (Size size : sizes) {
199+ double ratio = (double) size.width / size.height;
200+ if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) {
201+ continue;
202+ }
203+ if (size.height <= maxDesiredHeight) {
204+ if (captureHeight!=size.height && captureHeight <= size.height) {
205+ continue;
206+ }
207+ parameters.setPreviewSize(size.width, size.height);
208+ captureWidth = size.width;
209+ captureHeight = size.height;
210+ _isFoundCapSize = true;
211+ }
212+ }
213+
214+ if (!_isFoundCapSize) {
215+ parameters.setPreviewSize(desiredWidth, desiredHeight);
216+ }
217+
218+ // フレームレート
149219 parameters.setPreviewFrameRate(desiredFrameRate);
150220
151221 // 再設定
Show on old repository browser