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

2024-04-05

我正在使用 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。


在某一点上,相机设备会将您请求的尺寸舍入为支持的尺寸,以使相机预览设置更灵活,但最高只能为 1080p(通常保证合理的预览帧速率)。

除此之外,您实际上需要从设备提供的列表中选择支持的分辨率,否则您将四舍五入为 1080p。

相机支持的输出尺寸和格式可以通过以下方式查询流配置映射 http://developer.android.com/reference/android/hardware/camera2/params/StreamConfigurationMap.html.getOutputSizes()。您需要扫描列表以查找符合您要求的尺寸,并且其纵横比与图像传感器的纵横比相匹配(可通过活动数组大小 http://developer.android.com/reference/android/hardware/camera2/CameraCharacteristics.html#SENSOR_INFO_ACTIVE_ARRAY_SIZE)

我也会仔细检查 1080p 以下的所有尺寸,以确保您确实得到了您想要的。舍入始终为较低分辨率,以最大限度地降低性能和内存要求。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 如何使用 ASP.NET 5 MVC 6 保护 Web API

    我有一个很好的 ASP NET 5 MVC 6 应用程序正在运行 本质上 出于此目的 它只是您在启动新项目时获得的普通示例应用程序 以保持简单 到目前为止我可以 注册用户 Login Logout 保护页面 强制登录等 现在 我想要的是为应
  • “venv activate”不会改变我的Python路径

    我创建了一个虚拟环境 假设 test venv 我激活它 一切成功 然而 Python 解释器的路径不会改变 我已经在下面说明了这种情况 为了澄清起见 python 路径应该是 Desktop test venv bin python gt
  • .NET System.Text.Decoder.Convert 方法在字符中间返回completed==true

    我需要从 UTF 8 字节序列中读取一个字符串 这些字节的来源来自单独的读取操作 这些操作不考虑字符边界 因此我无法使用 System Text Encoding UTF8 GetString 但是 由 System Text Encodi
  • x86汇编代码的语法

    我试图了解操作系统的基础知识 并在 OCW 中找到了相关课程 名为 6 828 我在课程的实验室中找到了引导加载程序的代码 我尝试了但不明白以下部分代码 Enable A20 For backwards compatibility with
  • 仅防止二元运算符的隐式转换运算符

    我遇到了一个问题 我已将其归结为以下问题 其中 即使应该失败 运算符用法也会编译 C 17 在 GCC 5 x 8 x 和 9 x 上测试 template
  • 如何从节点本机插件正确创建 Buffer 对象?

    我正在使用节点 6 9 1 并尝试创建一个 cpp 插件来创建节点缓冲区对象 经过一番研究 我想出了以下代码 include
  • 展平单子栈

    所以我的第一个严肃的 haskell 项目中到处都有这样的代码 f MonadTrans t gt ExceptT t StateT A B C f do mapExceptT lift do lift do lift do r lt re
  • C++ 中集合集合的高效集合交集

    我有一个收藏std set 我想以最快的方式找到这个集合中所有集合的交集 集合中的集合数量通常非常小 5 10 每个集合中的元素数量通常小于 1000 但偶尔会达到 10000 左右 但是我需要进行数十次这些交集数千次 尽可能快 我尝试对以
  • WPF 的免费字体和颜色选择器?

    我正在为 WPF 寻找一些好的字体选择器和颜色选择器组件 我试图找到一些标准解决方案 例如 Winforms 组件 但似乎没有 我想知道为什么 它不一定是完美的 代码项目中的一些东西就足够了 但我更喜欢好看且直观易用的组件 谢谢 Look
  • 响应式 SVG 图像蒙版

    我使用 SVG 作为图像蒙版 但我不知道如何在调整页面大小时使 SVG 改变其大小 当我更改窗口大小时 SVG 内的图像会调整大小 但 SVG 不会 关于如何解决这个问题有什么想法吗 这是 SVG 代码
  • 避免在 Swift 中使用连续的“if let”声明[重复]

    这个问题在这里已经有答案了 在斯威夫特我用过if let声明来检查我的对象是否不是nil if let obj optionalObj 但有时候 我不得不面对连续的if let声明 if let obj optionalObj if let
  • 支持多个Python模块版本(具有相同版本的Python)

    我环顾四周 但找不到我的问题的明确答案 我非常合理地需要支持同一 Python 模块的 N 个版本 如果它们存储在同一个包 目录中 则它们必须具有唯一的名称 如下例所示 some package my module 1 0 py some
  • 通过 JavaScript 正则表达式获取 url 路径名的一部分

    我有以下网址 https www example com article f 1 test article 我需要通过 JavaScript 纯 JavaScript 从 url 中获取 1 部分 我知道我可以用 location path
  • knockoutjs 中的滑动动作绑定

    我在我的应用程序中使用淘汰赛作为主要框架 它必须支持平板电脑和移动设备 由于框架是基于绑定处理程序构建的 我想知道如何实现对操作 如滑动和其他特定于设备的操作 的自定义绑定 或者也许有类似的事情完成 可能为时已晚 但这里有一个库 将触摸绑定
  • DB2 WITH 语句可以用作 UPDATE 或 MERGE 的一部分吗?

    我需要更新数据库表中的一些行 如何识别要更新的行涉及一系列复杂的语句 我设法将它们归结为一系列WITH语句 现在我有了正确的数据值 我需要更新表 由于我设法使用WITH语句获取这些值 因此我希望在更新 合并中使用它 一个简化的示例如下 wi
  • 如何更改 Ubuntu 中的文件权限 [重复]

    这个问题在这里已经有答案了 在 Ubuntu 中 我想更改整个文件夹及其所有子文件夹的文件权限以供任何人读 写 我努力了sudo chmod 666 var www and sudo chmod 755 var www没有成功 update
  • Facebook 重置“在 Facebook 上分享”链接的缓存

    我刚刚更新了我们网站的的开放图协议 我刚刚注意到 每当我分享一些链接时 旧的是 Facebook 正在解析的 但是 对于我运行的那些链接debugger https developers facebook com tools debug他们
  • 仅当 command1 在 cmd windows shell 中成功时才运行 command2

    我们如何组合 cmd shell 语言中的命令 以便仅在第一个命令成功完成时才执行第二个命令 类似以下 bash 命令 make a out a out仅在以下情况下执行make那是成功的 下列 command1 command2 应该致力
  • 读取 nul 分隔字段

    给定这个文件 printf alpha 0bravo 0charlie gt delta txt 我想将这些字段读入单独的变量中 我使用的原因 空分隔符是因为字段将包含文件路径 其中可以包含 除 null 之外的任何字符 我尝试了这些命令
  • Android 中某些相机分辨率下的不同捕获输出大小

    我正在使用 Android Camera2 API 开发一个自定义相机应用程序 您可以在手机中可用的不同相机和视频分辨率之间切换 它还提供了拍摄 1 1 方形照片的可能性 为了拍摄方形照片 我拍摄了一张正常的 4 3 照片 然后将其裁剪以保