Я разрабатываю пользовательское приложение для камеры с помощью Android Camera2 API, где вы можете переключаться между различными разрешениями камеры и видео, доступными в телефоне. Он также предлагает возможность снимать квадратные снимки 1: 1. Чтобы взять квадратные снимки, я беру обычное изображение 4: 3, а затем обрезаю его, чтобы сохранить 1: 1. (Таким образом, 4032x3024 будет 3024x3024).Различные размеры вывода на определенные разрешения камеры в Android
Я заметил проблему при съемке изображения 1: 1 на определенных разрешениях, выход слегка обрезается (увеличивается). Это результат того же снимка с двумя различными разрешениями:
The first picture was taken at 1944x1944
The second picture was taken at 3024x3024
My Nexus 5X поддерживает 12MP, 8MP, 5MP и 2Mp 4: 3. Эта проблема возникает, когда я использую разрешение более 5 МП.
метод я использую, чтобы обрезать изображения заключается в следующем:
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();
}
Я предполагаю, что причина для обрезки является 4: 3 изображение в 16: 9. Потому что я заметил, что при вызове
Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
Размеры для сгенерированного выходного битового массива являются 1280x960 (4: 3) в 2МПЕ, 1600x1200 (4: 3) в 5MP, но для больших разрешений 1920x1080 (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, выглядит только 1080x1080. Так что да, кажется, вы обрезаете изображение 1920x1080 на квадрат. Итак, ImageReader дает вам другой размер, чем вы хотели. Как вы настраиваете ImageReader? Похоже, этот код выбирает неправильный размер для более высоких разрешений. –
Я добавил код для ImageReader. Входной сигнал размера для ImageReader - это точный результат, который я хочу, например 3024x3024, который работает для меньших разрешений. –
А, это будет проблема. См. Мой ответ. –