我正在使用 Android Camera2 API 开发一个自定义相机应用程序,您可以在手机中可用的不同相机和视频分辨率之间切换。它还提供了拍摄 1:1 方形照片的可能性。为了拍摄方形照片,我拍摄了一张正常的 4:3 照片,然后将其裁剪以保持 1:1。 (所以 4032x3024 将是 3024x3024)。
我注意到在某些分辨率下拍摄 1:1 图片时存在一个问题,输出会被轻微裁剪(缩放)。这是使用两种不同分辨率拍摄的同一张照片的结果:
第一张照片拍摄于 1944x1944 https://i.stack.imgur.com/3kzHo.jpg
第二张照片的分辨率为 3024x3024 https://i.stack.imgur.com/KTFDi.jpg
我的 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();
}
我猜测裁剪的原因是 16:9 容器中的 4:3 图像。因为我注意到打电话时
Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
生成的位图输出的尺寸在 2MP 中为 1280x960 (4:3),在 5MP 中为 1600x1200 (4:3),但对于更大的分辨率为 1920x1080 (16:9),因此 4:3 图像将调整为 16:9位图,可能会导致裁剪。
我正在想办法解决这个问题。我也查了这个帖子Android 5.0 预览表面和捕获的静态图像上的裁剪区域错误 https://stackoverflow.com/questions/26583489/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。