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 相机 - 预览尺寸、图片尺寸、裁剪和扭曲 的相关文章

  • 在 Android 上通话结束时启动活动

    我想在通话结束时启动一项活动 找不到任何对此的参考 我该怎么做 我还没有尝试过这个 但我假设你可以运行一些服务 始终在后台运行 它利用电话状态监听器 http developer android com reference android
  • android edittext中的字符映射

    我想让我的编辑文本就像我写字符 g 时一样 它是相关的映射自定义字符应该写成印地语中的 我认为应该有字符映射 但没有知识任何人都可以帮助我 怎么做 其他应用程序https play google com store apps details
  • Cheesesquare:enterAlways 会产生错误的布局

    Adding enterAlways到 Cheesesquare 演示的滚动标志
  • 如何在android中显示保存在sdcard文件夹中的图像[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 当我正在显
  • Android Q:file.mkdirs() 返回 false

    我们有一个应用程序 使用外部存储来存储一些临时文件 图像 二进制数据 该代码已经运行了几年 直到最近才发生重大变化 在 Android Q 上它不起作用 File f new File Environment getExternalStor
  • 如何使用 Google Maps for Android V2 处理地图移动结束?

    我想在地图中心更改后立即对地址进行地理编码 如何使用新的 Android 版 Google 地图 V2 处理地图移动 我说的是用户用手指拖动地图的情况 查看新的地图 API Override public void onMapReady G
  • 如何更改终端的默认目录?

    我想更改 Android Studio v2 2 2 终端的默认目录 当我打开终端时 它基于项目的目录 C 项目路径 我经常需要使用adb shell 所以我必须导航到 SDK 路径 平台工具 才能使用 adb 命令 是否可以更改终端的默认
  • 在 Cordova 应用程序中获取额外功能

    我们有两个 Android 应用程序 一个使用本机 Java 实现 另一个使用 Ionic 编写 Ionic 应用程序启动我的应用程序 这是使用灯插件 https github com lampaa com lampa startapp 我
  • Android 深度链接至 Instagram 应用

    Instagram 已经发布了 iOS 深层链接的 url 方案 但尚未为 Android 创建文档 有没有办法深入链接到 Android 上的 Instagram 应用程序 以转到 Instagram 应用程序中的特定位置 例如 Inst
  • 在 android 中建立与 MySQL 的池连接

    我需要从我的 Android 应用程序访问 MySQL 数据库 现在所有的工作都通过 DriverManager getConnection url 等等 但我必须从多个线程访问数据库 所以我必须使用连接池 问题1 是 com mysql
  • 从 BroadcastReceiver 类调用活动方法

    我知道我可以做一个内部接收器类来调用接收器中的任何方法 但我的主要活动太大了 要做的事情也很多 因此 我需要一个扩展广播接收器的类 但它不是内部类 并且可以从我的主要活动中调用一种方法 我不知道是否可能 但我的活动是家庭活动和 single
  • Android - AudioRecord类不读取数据,audioData和fftArray返回零

    我是 Android 新手 一直在开发音调分析器应用程序 最低 SDK 8 我读了很多关于如何实现 Audiorecord 类的文章 但我想知道为什么它在我录制时不读取任何数据 我尝试显示 audioData 和 fftArray 的值 但
  • 使用片段时应用程序崩溃

    我正在处理碎片和 我的代码中有一个我找不到的问题 logcat 指向我的一个片段中的这段代码 Override public View onCreateView LayoutInflater inflater ViewGroup conta
  • 如何检查 Android 中的同步设置

    我正在构建一个 Android 应用程序 我需要检查设备中注册的每个单独帐户的同步设置 我知道我可以通过 ContentResolver 类来做到这一点 但我遇到了一些问题 我已设法获取设备上所有帐户的列表 但我不知道在运行时从哪里获取特定
  • 通过电子邮件发送文本文件附件

    我正在尝试附加一个文本文件以便通过电子邮件发送 但每当我打开电子邮件应用程序时 它都会说该文件不存在 请帮助 Intent i new Intent Intent ACTION SEND i setType text plain i put
  • Android:如何从网络异步获取搜索建议?

    我创建了一个可搜索的活动 现在 我想添加从网络服务获取的搜索建议 我想异步获取这些建议 根据添加自定义建议 http developer android com guide topics search adding custom sugge
  • 我的应用程序中的后退按钮出现问题[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我想在手机关闭时清除共享首选项值 你
  • Android 屏幕方向错误

    我使用的是 Android HTC HERO 2 1 版本 我写的活动
  • Git 实验分支还是单独的实验存储库?

    我正在开发一个 Android 应用程序 并且在整个开发周期中一直使用 Git 现在 我想构建并发布实验性功能 供人们尝试和安装 同时仍将原始的 稳定的应用程序安装在他们的设备上 现在 这意味着我需要使用不同的包名称 这会更改开发项目中的一
  • 有没有任何代码可以在android中设置壁纸而无需裁剪和缩放?

    我正在创建一个画廊应用程序 我的第一个应用程序 这是我的代码 Bitmap bmd BitmapFactory decodeStream is try getApplicationContext setWallpaper bmd catch

随机推荐

  • 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高 因此我需要裁剪拍摄的图片以符合我的规格 这个看似简单的程序让我对预览和图片尺寸和格式之间 良好 对应的问题感到疯狂 让我解释 我需