撮影サイズとプレビュー領域のアスペクト比を同じにする|Android開発

      2018/09/06

撮影サイズと同じアスペクト比でプレビュー領域を作成するサンプルです。
こうすることで、見た目と同じ領域の画像が撮影されます。

レイアウト抜粋

<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/camera_preview_root">

    <SurfaceView
        android:id="@+id/camera_surface"
        android:layout_gravity="center_horizontal"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</FrameLayout>

SurfaceView のサイズ計算

Fragmentクラスの場合のサンプルです。
撮影サイズはportraitで撮影した時のサイズを利用します。

@Override
public void surfaceCreated(SurfaceHolder holder) {
    SurfaceView surfaceView = (SurfaceView) getActivity().findViewById(R.id.camera_surface);
    View root = getActivity().findViewById(R.id.camera_preview_root);

    int degrees = ディスプレイ回転度
    int pictureWidth = 撮影サイズ幅
    int pictureHeight = 撮影サイズ高さ

    Size changeSize;
    Size viewSize = new Size(root.getWidth(), root.getHeight());
    if (degrees == 90 || degrees == 270) {
        changeSize = calculateViewSize(pictureHeight, pictureWidth, viewSize);
    } else {
        changeSize = calculateViewSize(pictureWidth, pictureHeight, viewSize);
    }
    ViewGroup.LayoutParams layoutParams = surfaceView.getLayoutParams();
    layoutParams.width = changeSize.getWidth();
    layoutParams.height = changeSize.getHeight();
    surfaceView.setLayoutParams(layoutParams);
}

/**
    * 幅と高さと同じアスペクト比かつ、maxSize に収まる View のサイズを取得する.
    * @param width アスペクト比の計算に使用する幅.
    * @param height アスペクト比の計算に使用する高さ.
    * @param maxSize 最大の矩形サイズ.
    * @return View サイズ.
    */
protected Size calculateViewSize(int width, int height, Size maxSize) {
    int h = maxSize.getWidth() * height / width;
    if (h % 2 != 0) {
        h--;
    }
    if (maxSize.getHeight() < h) {
        int w = maxSize.getHeight() * width / height;
        if (w % 2 != 0) {
            w--;
        }
        return new Size(w, maxSize.getHeight());
    }
    return new Size(maxSize.getWidth(), h);
}

ディスプレイ回転度の計算

Camera実装時によく使う処理のサンプル|Android開発

 - Android