Android

时间:2016-03-22 14:16:04

标签: android android-camera android-5.0-lollipop android-bitmap android-camera2

我正在使用Android Camera2 API开发自定义相机应用程序,您可以在其中切换手机中可用的不同相机和视频分辨率。它还提供了拍摄平方1:1照片的可能性。为了拍摄正方形照片,我拍摄正常的4:3照片,然后裁剪它以保持1:1。 (所以4032x3024将是3024x3024)。

我注意到在某些分辨率上拍摄1:1照片时出现问题,输出会略微裁剪(缩放)。这是使用两种不同分辨率拍摄的相同照片的结果:

The first picture was taken at 1944x1944

The second picture was taken at 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();
}

我猜测裁剪的原因是16:9容器中的4:3图像。因为我在调用时注意到了

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

生成的位图输出的尺寸在2MP时为1280x960(4:3),在500万像素时为1600x1200(4:3),但对于更大的分辨率为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。

1 个答案:

答案 0 :(得分:3)

在某一点上,相机设备会将您要求的尺寸调整为支持的尺寸,以使相机预览更灵活地设置,但最多只能达到1080p(通常可以保证合理的预览帧速率)。 / p>

过去,您需要从设备提供的列表中实际选择支持的分辨率,否则您只需向下舍入到1080p。

可以使用StreamConfigurationMap。getOutputSizes()查询相机支持的输出尺寸和格式。您需要扫描列表以查找符合您要求的大小,并且其宽高比与图像传感器的宽高比相匹配(可通过activeArraySize获得)

我还要仔细检查1080p以下的所有尺寸,以确保你真正得到你想要的东西。舍入始终是较低的分辨率,以最大限度地降低性能和内存要求。