Android中某些相机分辨率的不同捕获输出大小

Android中某些相机分辨率的不同捕获输出大小,第1张

概述我正在使用 Android Camera2 API开发自定义相机应用程序,您可以在手机中提供不同的相机和视频分辨率.它还提供了拍摄平方1:1照片的可能性.为了拍摄正方形照片,我拍摄正常的4:3照片,然后裁剪它以保持1:1. (所以4032×3024将是3024×3024). 我注意到在某些分辨率上拍摄1:1照片时出现问题,输出会略微裁剪(缩放).这是使用两种不同分辨率拍摄的相同照片的结果: The 我正在使用 Android Camera2 API开发自定义相机应用程序,您可以在手机中提供不同的相机和视频分辨率.它还提供了拍摄平方1:1照片的可能性.为了拍摄正方形照片,我拍摄正常的4:3照片,然后裁剪它以保持1:1. (所以4032×3024将是3024×3024).

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

The first picture was taken at 1944×1944

The second picture was taken at 3024×3024

我的Nexus 5X在4:3上支持12MP,8MP,5MP和2MP.当我使用任何大于500万像素的分辨率时会发生此问题.

我用来裁剪图像的方法如下:

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,bytes.length);    int w = bitmap.getWIDth();    int h = bitmap.getHeight();    Bitmap dst = Bitmap.createBitmap(bitmap,h - w,w,w);    dst.compress(Bitmap.CompressFormat.JPEG,98,bos);    return bos.toByteArray();}

我猜测裁剪的原因是16:9容器中的4:3图像.因为我在打电话时注意到了

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

生成的位图输出的尺寸在2MP时为1280×960(4:3),在500万像素时为1600×1200(4:3),但对于更大的分辨率为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的值是我想要的输出.所以对于平方图像,它就像3024×3024.

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

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

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

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

总结

以上是内存溢出为你收集整理的Android中某些相机分辨率的不同捕获输出大小全部内容,希望文章能够帮你解决Android中某些相机分辨率的不同捕获输出大小所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1128036.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-30
下一篇2022-05-30

发表评论

登录后才能评论

评论列表(0条)

    保存