4

Android Camera2 API を使用して、電話で利用可能なさまざまなカメラとビデオ解像度を切り替えることができるカスタム カメラ アプリケーションを開発しています。また、正方形の 1:1 写真を撮ることもできます。正方形の写真を撮るには、通常の 4:3 の写真を撮り、1:1 を維持するためにトリミングします。(したがって、4032x3024 は 3024x3024 になります)。

特定の解像度で 1:1 の写真を撮影すると、出力がわずかにトリミング (ズーム) されるという問題に気付きました。これは、同じ写真を 2 つの異なる解像度で撮影した結果です。

最初の写真は 1944x1944 で撮影されました

2 番目の写真は 3024x3024 で撮影されました

私の Nexus 5X は 4:3 で 12MP、8MP、5MP、2MP をサポートしています。この問題は、5MP を超える解像度を使用すると発生します。

画像をトリミングするために使用する方法は次のとおりです。

ByteBuffer buffer = mImage.getPlanes()[0].getBuffer();
byte[] bytes = new byte[buffer.remaining()];
buffer.get(bytes);
cropSquareImageByteArray(bytes);

cropSquareImageByteArray メソッド:

public static byte[] cropSquareImageByteArray(byte[] bytes) {
    ByteArrayOutputStream bos = new ByteArrayOutputStream();

    Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
    int w = bitmap.getWidth();
    int h = bitmap.getHeight();
    Bitmap dst = Bitmap.createBitmap(bitmap, 0, h - w, w, w);
    dst.compress(Bitmap.CompressFormat.JPEG, 98, bos);
    return bos.toByteArray();
}

I am guessing the reason for the cropping is a 4:3 image in a 16:9 container. Because I noticed that when calling

    Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);

The dimensions for the generated bitmap output are 1280x960 (4:3) in 2MP, 1600x1200 (4:3) in 5MP but for bigger resolutions are 1920x1080 (16:9), so the 4:3 image is adjusted to a 16:9 bitmap, maybe causing the crop.

I am trying to figure out how to solve this. I also checked this post Android 5.0 Wrong crop regions on preview surface and captured still image but didn't find a solution there.

*edit: My ImageReader is configured like this:

public void configureImageReader(Size pictureSizeValue, ImageReader.OnImageAvailableListener listener) {

    if (mImageReader == null) {
        mImageReader = ImageReader.newInstance(pictureSizeValue.getWidth(), pictureSizeValue.getHeight(),
                ImageFormat.JPEG, 2);
    } 
    mImageReader.setOnImageAvailableListener(listener, mBackgroundHandler);

}

The value for pictureSizeValue is the output I want. So for a squared image, it is something like 3024x3024.

4

1 に答える 1