Android の Camera2 API を使って カメラのプレビュー画面を表示する
の続きです。
下記の記事を参考にした。
ズームをサポートしているか
ズームに関するパラメータには、
ズームのタイプと最大値がある。
ズームのタイプには、 中央でズームする TYPE_CENTER_ONLYと2任意の位置でズームする TYPE_FREEFORM の2つがある。
ズームの最大値が !.0 以上の時は、その大きさまでズームできる。
reference: SCALER_CROPPING_TYPE
reference: SCALER_AVAILABLE_MAX_DIGITAL_ZOOM
// ズームのタイプ
int type = characteristics.get(CameraCharacteristics.SCALER_CROPPING_TYPE);
// ズームの最大値
float mazZoom = characteristics.get(CameraCharacteristics.SCALER_AVAILABLE_MAX_DIGITAL_ZOOM);
Nexus 5 は、ズームのタイプは TYPE_CENTER_ONLY です。
最大値は 4.0 です。
ズームを要求する
センサの領域の中の長方形(Rectangle) を指定して、要求する。
センサの領域の大きさと長方形の大きさの比率がズームの比率になる。
ズームの比率の値ではないので、一手間かかる。
reference: CaptureRequest#SCALER_CROP_REGION
// 長方形を計算して求める
Size activeArraySize;
// センサの中心の座標
int cx = activeArraySize.centerX();
int cy = activeArraySize.centerY();
// 長方形の大きさ
int w = activeArraySize.width() / zoomLevel;
int h = activeArraySize.height() / zoomLevel;
// 長方形の座標
int left= cx - w/2;
int right= cx + w/2;
int top= cy - h/2;
int bottom = cy + h/2;
Rect cropRegion = new rect(left, top, right, bottom);
// ズームを要求する
captureBuilder.set(CaptureRequest.SCALER_CROP_REGION, cropRegion);
captureSession.capture(captureBuilder.build(), captureCallback, backgroundHandler);
ズームした写真を撮る
プレビューと写真は、必ずしも連動していない。
写真を撮る時に、ImageReader をターゲットにしてズームを要求する。
CaptureRequest.Builder captureBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
captureBuilder.addTarget(mImageReaderStill.getSurface());
captureBuilder.set(CaptureRequest.SCALER_CROP_REGION, cropRegion);
captureSession.capture(captureBuilder.build(), captureCallback, backgroundHandler);
ズームのユーザーインターフェイス
以下のものが考えられる。
- Viewのボタン
- ボリュームの物理ボタン
- スクリーン画面を指で広げる操作
Nexus 5 の最大ズーム4倍なので段階的にズームするほどでもないか。
ボタンをクリックした時に、最大ズームにするので、十分かな。
サンプルコードを GitHub に公開した。
https://github.com/ohwada/Android_Samples/tree/master/Camera215