Android 相机 - 预览尺寸、图片尺寸、裁剪和扭曲

2024-01-13

我的应用程序需要以纵向模式捕获一些给定尺寸(比如说宽x高)的图片。

一般情况下,相机不支持我想要的尺寸(宽x高),因此我需要裁剪拍摄的图片以符合我的规格。

这个看似简单的程序让我对预览和图片尺寸和格式之间“良好”对应的问题感到疯狂。 让我解释:

我需要一个输出图像的格式(让我们给出一些数字:800x600),并且我必须以纵向屏幕方向拍照。我的相机默认处于横向模式,因此它拍摄的照片宽度远大于高度。但由于我想要纵向预览,我需要旋转图像,因此我得到的图像高度远大于宽度(我猜是原始图像的转置)。

在这种情况下,我需要从更大的垂直延伸的矩形中剪切水平延伸的矩形,我想通过具有可接受的大预览来做到这一点。

从图片中裁剪出图像的问题并没有吓到我(目前),最重要的问题是用户在预览中看到的内容与相机实际捕获的内容之间的匹配。

对于每个可能的电话,我需要:
- 根据所需图像格式选择合适的相机图片尺寸 - 根据图片尺寸和格式选择合适的相机预览尺寸。
- 隐藏将被裁剪的预览部分。
并且具有不失真和大预览的限制。 一般怎么做呢?

我的想法和尝试:

主要算法步骤为:
- 一旦知道所需的格式,即可获得最佳的图片尺寸
- 一旦知道图片尺寸即可获得最佳预览尺寸
- 隐藏预览中无法捕获的部分
- 裁剪图像

尝试过方法1)
A)我通过最小化面积差异来获得最佳图片尺寸(我还可以检查纵横比亲和力不是很重要)。 (Size是自定义类型,与Camera.Size不同)

public Size getOptimalPictureSize(List<Camera.Size> sizes) {

        Size opt = new Size();
        float objf = Float.MAX_VALUE;   
        float v;
        for(Camera.Size s : sizes){
            if(s.height<target_size.width || s.width<target_size.height)
            continue;

            v = (s.height-target_size.width)*s.width + (s.width-target_size.height)*target_size.width;

            if(v<objf){
                opt.width=s.width;
                opt.height=s.height;
                objf=v;
            }
        }

        return opt;

}

B)我通过找到不同宽高比(相对于图片尺寸)之间的最佳折衷来获得最佳预览尺寸:

    @Override
    public Size getOptimalPreviewSize(Size picSize,List<android.hardware.Camera.Size> sizes) {
        Size opt = new Size();
        double objf = Double.MAX_VALUE;
        double aspratio = picSize.getAspectRatio();
        double v;

        for(Camera.Size s : sizes){
            v = Math.abs( ((double)s.width)/((double)s.height) - aspratio )/(Math.max(((double)s.width)/((double)s.height), aspratio));

            if(v<objf){
                objf=v;
                opt.width=s.width;
                opt.height=s.height;
            }
        }

        return opt;

    }

C) 隐藏仅显示可捕获部分的方法....(稍后讨论)

** 试用 2) **

A)我通过最小化最优函数来获得图片和预览尺寸,该函数同时权衡相机图像长宽比与所需长宽比之间的不匹配以及预览和图片长宽比之间的不匹配。

public void setOptimalCameraSizes(List<Camera.Size> preview_sizes,List<Camera.Size> picture_sizes,Size preview_out, Size picture_out) {

        double objf=Double.MAX_VALUE;

        double tmp;
        for(Camera.Size pts : picture_sizes){
            for(Camera.Size pws : preview_sizes){

                tmp = percv(((double)pws.height)/((double)pws.width),target_size.getAspectRatio())
                      + percv(((double)pws.width)/((double)pws.height),((double)pts.width)/((double)pts.height));

                if(tmp<objf){
                    preview_out.set(pws.width, pws.height);
                    picture_out.set(pts.width, pts.height);
                    objf=tmp;
                }

            }
        }



}

where

percv(a,b) = |a-b|/max(|a|,|b|) 测量相对偏差(因此是无量纲的)。

C) 一些隐藏方法...

好吧,这两种尺寸选择方法是我发现的最好的,并选择了好的尺寸,但是它们有一个来自相机横向方向的生理问题......它们只能产生垂直的矩形图像,这意味着当我绘制预览时,我可以得到两个案例:
1.我设置表面尺寸,以免预览图像变形 -> 由于高度巨大,这反映在图像可见的非常小的有效区域中(因此用户体验受到损害)
2.我设置了最大可能的宽度->我可以获得(这取决于预览纵横比)扭曲的预览,但比情况1大得多。

如何避免这些问题呢??

我认为是算法的 C) 阶段(隐藏阶段)的工作,我尝试:

trial 1:使相机预览超出屏幕尺寸。这将允许我对感兴趣的区域进行任意缩放并使屏幕裁剪预览。我尝试使用滚动视图,但它不起作用,我不知道为什么。拓扑很简单,根滚动视图和带有附加表面视图的 FrameLayout 内部,但表面总是填充屏幕,导致可怕的扭曲。
trial 2:捕获相机帧并通过重写 onPreviewFrame(.) 方法直接操作它们:我在锁定画布时遇到了一个神秘的错误(IllegalArgumentException)

我该如何解决这个问题?


None

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

Android 相机 - 预览尺寸、图片尺寸、裁剪和扭曲 的相关文章

随机推荐

  • Google Hangouts 网站按钮

    是否可以在我的企业网站上添加一个 Google Hangouts 按钮 单击该按钮即可向我发起呼叫 我有一个商业网站 我希望任何人都可以像嵌入在网站页面上的 Skype 按钮一样进行呼叫 我遇到的问题是我去了https developers
  • 如何在两个设备之间共享我使用 sqlite 数据库存储的所有数据,以便通过转储到另一个设备中来重用数据

    我已经实现了一个应用程序iPhone 目标 c 我用过SQLITE对于数据库 现在我需要分享数据 分享数据 我需要通过邮件发送数据 我附上我的数据库文件 可能是 csv 格式 通过转储数据在其他应用程序中重新使用我的数据 任何有用的回复 提
  • 命名空间“Microsoft.EntityFrameworkCore”中不存在类型或命名空间名称“Relational”

    在 VS 2017 中的 ASP Net Core 1 1 Web 应用程序中 我需要引用该包 Microsoft EntityFrameworkCore Relational 这是为了调用带有结果集的存储过程 如下所述 如何在 Entit
  • 使用 jsZip 将 url 中的图像添加到 zip 文件

    我正在尝试使用 jsZip 创建一个 zip 文件 zip 文件的内容是来自网络的图像 我创建了以下代码 但是当我运行它时 我得到的只是一个 22kb 的空 zip 文件
  • 沿 X 方向标记

    我从未使用过 Google 地图 API 对于我正在从事的学校项目 我需要在两个位置之间找到方向 这是简单的部分 我想我可以做到这一点 然而我还需要打一个X标记 沿途每 10 英里 这可能吗 谢谢 好的 这里有一个可行的解决方案 每 200
  • 将元素颜色重置为默认样式表颜色(jQuery、JavaScript)

    我需要能够在输入字段可能通过 javascript 更改为不同的值后将其重置回其原始颜色 问题是我不想对值进行硬编码 以防样式表发生变化 我想使用页面上使用的默认颜色 像这样重置颜色很好吗 或者有更好的方法吗 theinput css co
  • 比这更通用的 parfoldr

    我的目标是拥有并行的foldr 功能 起初 似乎 实现起来相当简单 这就是我的想法 首先根据输入列表的数量将输入列表分成多个分区 核心 numCapabilities 然后将foldr应用到每个分区 其中 将产生每个分区的折叠值列表 然后做
  • 使用 bash 仅提取传入电子邮件的正文部分

    I use offlineimap将邮件提取到 Maildir 文件夹中 我想自动解析 Maildir 文件夹中的所有新传入电子邮件 并仅将 发件人 主题 和 正文 作为即时消息发送到其他地方 所以我尝试处理所有邮件 MPATH Mail
  • Python SMTP 错误 10060

    有人可以给我一些关于为什么会出现这种情况的见解吗 mailServer smtplib SMTP smtp gmail com 587 和这个 mailServer smtplib SMTP smtp gmail com 587 正在说这样
  • 如何在 Team City 中运行所有 NUnit 测试?

    我们每次提交时都使用 TeamCity 6 0 构建 VS C 解决方案 构建完成后 另一个测试 TC 项目就会运行 为了让开发人员可以添加 删除 编辑 VS 单元测试项目 如何让 TeamCity 使用 sln 文件或搜索测试 dll 我
  • R中的模糊外连接/合并

    我有 2 个数据集 想要进行模糊连接 这是两个数据集 library data table data1 dt1 lt fread NAME State type ABERCOMBIE TOWNSHIP ND TS ABERDEEN TOWN
  • MacOS 终端:如何使用第二个 ssh 密钥?

    我正在 MacOS 上工作 想要使用第二个 ssh 密钥进行 SSH Git 登录 我在 ssh 中有两个密钥对 id rsa id rsa pub id rsa gitlab id rsa gitlab pub id rsa 和 id r
  • 如何获取 SLURM 数组作业中失败和已完成作业的计数

    我正在使用 slurm 运行多个数组作业 对于给定的数组作业 ID 假设为 885881 我想列出失败作业和已完成作业的计数 像这样的事情 Input
  • async 是否会使其中的所有内容异步?

    据 MDN 报道 async 函数声明定义了一个异步函数 我理解它是因为该函数将被视为异步进程 就像setTimeout或一些数据库请求 例如 在下面的示例中 进程应在数字之间的某个位置输出 main let func2 async gt
  • FiPy 中的固定通量边界条件

    我对此主题有一个后续问题FyPi 中的耦合非线性方程 https stackoverflow com questions 62640821 coupled non linear equations in fypi 当对所有变量使用诺依曼边界
  • 带镀铬的背景中心(错误)

    我有一张居中的背景图像 Chrome 显示偏移一个像素 CSS container background url images header jpg no repeat scroll 50 transparent width 100 hea
  • EF CORE 中的 DbFunctions.TruncateTime LINQ 等效项

    我的 net 应用程序中有以下功能正常的 LINQ public ActionResult Index Dictionary
  • 如何在 SQL Server 中创建参数化 XPath 查询?

    我正在尝试在 SQL Server 中编写一个参数化查询 该查询使用参数值作为 XPath 的一部分 但它似乎没有按照我期望的方式工作 这是我的样本 create table example xmltest xml declare Lang
  • 如何添加本地项目(不是 jar)作为 Maven 项目的依赖项

    我有两个 Maven 项目 我已将它们作为两个模块添加到一个 Intellij Idea 的项目中 项目 B 依赖于项目 A 以下是其 pom xml 文件的简化版本 项目A
  • Android 相机 - 预览尺寸、图片尺寸、裁剪和扭曲

    我的应用程序需要以纵向模式捕获一些给定尺寸 比如说宽x高 的图片 一般情况下 相机不支持我想要的尺寸 宽x高 因此我需要裁剪拍摄的图片以符合我的规格 这个看似简单的程序让我对预览和图片尺寸和格式之间 良好 对应的问题感到疯狂 让我解释 我需