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のようなものです。
3024x3024と思われる2番目の画像は、わずか1080x1080です。だから、あなたは1920x1080の画像を四角に切り取っているようです。 ImageReaderは、あなたが望むものとは異なるサイズを提供しています。 どのようにImageReaderを設定していますか?そのコードは、より高い解像度に対して間違ったサイズを選択しているようです。 –
ImageReaderのコードを追加しました。 ImageReaderの入力サイズは3024x3024のような、正確な出力です。これはより小さな解像度で動作します。 –
ああ、それは問題になるでしょう。私の答えを見てください。 –