close
当前位置: 物联网在线 > 技术文库 > ios >

[iOS] 图像处理 - 一种高效裁剪图片圆角的算法

经常看到各种高效裁剪圆角的文章,正好之前做过一点数字图像处理,就打算用空域处理的办法,写个裁剪圆角的算法,一定要尽可能的快的,不然界面容易卡顿。

裁圆角很简单,对于图像上的一个点(x, y),判断其在不在圆角矩形内,在的话 alpha 是原值,不在的话 alpha 设为 0 即可。如下图

[iOS] 图像处理 - 一种高效裁剪图片圆角的算法

我遍历所有像素,判断每个像素在不在4个圆的圆内就行了,4个角,每个角有一个四分之一的圆。

一个 优化 就是,我不需要遍历全部的像素就能裁出圆角,只需要考虑类似左下角三角形的区域就行了,左下,左上,右上,右下,一共4个三角形区域(另外3个图中没画出),for循环的时候,就循环这个4个三角形区域就行了。

所以对于一幅 w * h 的图像,设圆角大小为 n,n<= min(w, h) / 2,其复杂度为 O(n) = 2(n^2),最坏的情况计算量也不会超过 wh / 2

对于一个像素点(x, y),判断其在不在圆内的公式

如果 (x-cx)^2 + (y-cy)^2 <= r^2 就表示点 (x, y) 在圆内,反之不在。

理论说完了,下面看实际的测试数据。

测试结果与分析

根据上面的分析,我写了一个裁剪圆角的程序,叫为 my裁剪

还用了苹果 CoreGraphics 库的 CGContext 裁剪圆角,叫为 CGContext 裁剪

还用了 UIKit 的 UIBezierPath 裁剪圆角,叫为 贝塞尔裁剪

下面来对比三种方法,哪种最快,分别是

1.my裁剪

2.CGContext裁剪

3.贝塞尔裁剪

实验数据:

一张 png 格式 512 * 512 的 lena 女神的标准实验图像。

圆角大小分别取 10,50,100,250,这4个值。

每次实验裁剪 10000 张图片数据,获得总耗时。

因为图片是 512 * 512 的,最大的圆角为 512 / 2 = 256,所以超过 256 的会被强制设在 256,所以实验中用了个近似 256 的 250 做为最大的测试数据。

实验前关闭所有比较耗CPU的软件。实验中不操作电脑,避免影响实验结果准确性,最好真机测试,关掉后台所有APP。最后得到了以下实验数据,并绘制成表格。

[iOS] 图像处理 - 一种高效裁剪图片圆角的算法

表格.jpeg

根据上图可以看出 my 裁剪运行时间看起来像指数上升的,是不是会更慢?

答:不是的,看 x 轴的坐标间距,10 到 50 到 100,然后直接跳到 250 了,不是均等分的!要是画均等分的话,图会非常非常长。

如果要 x, y 轴刻度均等分的话,画出来的图大概是这样的,如下图:

[iOS] 图像处理 - 一种高效裁剪图片圆角的算法

表格2.jpeg

my 裁剪时间随着圆角大小线性上升,到达 256 的时候,是最大值了。

实验过程中的具体数据。

圆角为 10 的情况

[iOS] 图像处理 - 一种高效裁剪图片圆角的算法

圆角为 50 的情况

[iOS] 图像处理 - 一种高效裁剪图片圆角的算法

圆角为 100 的情况

[iOS] 图像处理 - 一种高效裁剪图片圆角的算法

圆角为 250 的情况

[iOS] 图像处理 - 一种高效裁剪图片圆角的算法

结论与分析

从上面数据可以看出:

时间上:不管圆角大小 n 是多少,CGContext 和 UIBezierPath,耗时都在 14.6 秒左右。而 my裁剪在圆角小的时候,性能较好,耗时在 3 秒左右,随着圆角增到250,耗时也去到了 12 秒,但最坏不会超过 w * h / 2,在 n<min(w, h) / 2 时,具有较高的性能,比CGContext, UIBezierPath要快。

空间上:内存使用上,没精确测量,大致看了一下,裁剪1万张 512 * 512的图片,3种算法的内存使用都在 10MB 左右,还可以接受,但 UIBezierPath 裁剪时居然会写磁盘。

另外,在图像编码/解码中,用了 CGDataProviderRef,CGImageRef,这两个对象,它们的速度应该是很快的了,如果自己写的话,预测可以更快。

使用方法都在代码的 ViewController.m 文件里,就这么一个文件,很好找,没有其他了。请在 iphone6,6 plus 的屏幕下运行。本实验重点在于3个算法,无关紧要的东西没做太多处理。


(责任编辑:ioter)

用户喜欢...

为了提高效率 - 如何将双向功率流集成到UPS设计中(第2部分)

在本系列的第1部分中,我讨论了如何将双向功率流集成到不间断电源(UPS)设计中。在第二部分中,我将更详细地介绍用于UPS和电池备份应用的2kW,48V至400V, 93%效率,隔离双向DC / DC转换器参...


为了提高效率 - 如何将双向功率流集成到UPS设计中(第1部分)

随着对更紧凑,更小和更高效的电力系统的日益重视,对双向转换器的兴趣日益增加。能够双向功率流的双向DC / DC转换器可以将传统上用于电池充电和备份操作所需的两个DC / DC转换器组合成一...


设计无传感器FOC电机控制的一种快速而简单的方法

电机控制应用设计人员今天面临来自市场,竞争对手和监管机构的压力,要优化其系统的性能和效率,同时将电子系统的成本降到最低。从家用电器中的泵,风扇和压缩机到无人机和电动自行车...


创建最终的嵌入式软件工作台

及时高效地构建嵌入式系统要求软件开发人员在其工作台上有合适的工具来完成工作。虽然预算通常是有限的,但是每个嵌入式软件工程师都需要一些工具来大大减少构建,调试和验证设计所需...


采用PWM控制的高效智能照明

发光二极管(LED)已迅速成为许多照明应用的首选。LED制造商提高效率和亮度意味着从汽车大灯到仓库和工厂照明等应用的其他同等选择也不多。LED优于其他选项的一个重要优点是其可控性,尽...


一种基于总线的智能型执行器系统设计

在自动控制系统中,执行器同控制器或控制系统相连,共同实现对工业过程的控制。现场总线是过程控制技术、仪表工业技术和计算机网络技术三大技术领域相结合的产物。WorldFIP现场总线既...


[原创] TI TIDA-01501 450W高效电源参考设计

TI公司的TIDA-01501是450W高效AC/DC转换器,AC输入85V-265V,多路DC输出12-V/5-V/3.3-V,最大输出功率450W.设计电路包括前端连续模式...


高效率、低功率转换 IC 提高可穿戴设备性能 并改善生活工作条件

可穿戴设备不再仅是在炫酷的科幻电影中才能看到的东西 (感谢《007》、《少数派报告》、《至尊神探》这些电影!),使用可穿戴设备也不再只是梦想,可穿戴设备已经蔚然成风。最初,可穿...


GaN Systems IMS评估平台在贸泽开售,助力高效电源系统开发

IMS评估平台 (50028) 电源系统 专注于新产品引入 (NPI) 并提供极丰富产品类型的业界顶级半导体和电子元件分销商贸泽电子 (Mouser Electronics) 即日起开始供货GaN Systems的GSP65RxxHB-EVB绝缘金属基板...


为IIoT提供高效安全的配置

在2016年的秋天,黑客招募了数十万个嵌入式设备,形成恶意僵尸网络。他们的Mirai恶意软件感染了宽带路由器,让僵尸网络的运营商利用它们进行分布式拒绝服务(DDoS)攻击。对于新兴的物联...