3
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Android の Camera2 API を使って ズームする

Last updated at Posted at 2019-06-29

Android の Camera2 API を使って カメラのプレビュー画面を表示する
の続きです。

下記の記事を参考にした。

Camera2のズーム指定

ズームをサポートしているか

ズームに関するパラメータには、
ズームのタイプと最大値がある。

ズームのタイプには、 中央でズームする 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

3
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?