4

Android Camera2 APIを使用してカスタムカメラアプリケーションを開発しています。このカメラでは、携帯電話で使用できるさまざまなカメラ解像度とビデオ解像度を切り替えることができます。また、1:1の画像を2乗することも可能です。正方形の写真を撮るために、私は通常の4:3の写真を撮り、1:1を維持するためにそれを切ります。 (したがって4032x3024は3024x3024になります)。Androidでの特定のカメラ解像度でキャプチャ出力サイズが異なる

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

The first picture was taken at 1944x1944

The second picture was taken at 3024x3024

私のネクサス5Xは4に12MP、8MP、5MPと2MPをサポートしています。この問題は、5MP以上の解像度を使用すると発生します。

Iは画像をトリミングするために使用する方法は以下の通りである:

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は、トリミングの理由を推測してい4:A 3画像16:9コンテナ。私は

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

を呼び出すときに生成されたビットマップ出力の大きさがあることに気づいたので1280×960(4:3)2MPでは、1600×1200(4:3)5MPではなく、より大きな解像度のためである1920×1080(16:9)、そのため、4:3画像は16:9ビットマップに調整され、おそらくトリミングが発生します。

私はこれを解決する方法を見つけようとしています。私もこの記事Android 5.0 Wrong crop regions on preview surface and captured still imageをチェックしましたが、そこに解決策が見つかりませんでした。

*編集:私のImageReaderは、このように構成されています

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); 

} 

pictureSizeValueの値は、私が欲しい出力されます。したがって、二乗された画像の場合、3024x3024のようなものです。

+0

3024x3024と思われる2番目の画像は、わずか1080x1080です。だから、あなたは1920x1080の画像を四角に切り取っているようです。 ImageReaderは、あなたが望むものとは異なるサイズを提供しています。 どのようにImageReaderを設定していますか?そのコードは、より高い解像度に対して間違ったサイズを選択しているようです。 –

+0

ImageReaderのコードを追加しました。 ImageReaderの入力サイズは3024x3024のような、正確な出力です。これはより小さな解像度で動作します。 –

+0

ああ、それは問題になるでしょう。私の答えを見てください。 –

答えて

3

カメラのプレビューは、カメラのプレビューをより柔軟に設定できるように、要求されたサイズをサポートされたサイズに丸めます(通常、プレビューには妥当なフレームレートが保証されます)。

これまでは、デバイスが提供するリストからサポートされている解像度を実際に選択する必要があります。そうしないと、1080pに切り下げられます。

カメラでサポートされている出力サイズとフォーマットは、StreamConfigurationMap .getOutputSizes()で照会できます。あなたの要件に合ったサイズのリストをスキャンし、イメージセンサーのアスペクト比(activeArraySizeから利用可能)

から1080p以下のすべてのサイズをまあ、あなたが実際にあなたが望むものを得ていることを確認する。パフォーマンスとメモリの要件を最小限に抑えるため、丸めは常に低い解像度に設定します。

関連する問題