iOS 长截图的完美实现方案 - 附Demo源码

长图拼接完美,完全可以媲美应用市场上的软件。

(因为是C++的算法,所以平台通用,如果你是独立开发者,可以用来上架APP)

由于iOS没有系统自带的长截图功能,所以只能用第三方的,AppStore上有几款好用的长截图APP,都需要付费使用,而且还不便宜。

比如:

  • Picsew 8元 - 15元;
  • 滚动截图 8元-48元;
  • Stitch 68元;

收费都很贵,那我想自己是不是可以做一个类似的软件来付费呢?

找了一些长截图的技术文章,发现似乎还真没有公开的技术方案,好像大家都藏着掖着的。

不过好在经历了几天的失败后,终于成功了。

核心拼接思想:

  1. 第一张图片: [内容A][重叠区域][内容B]

  2. 第二张图片: [内容C][重叠区域][内容D]

  3. 图片正序或者倒序不影响结果

  4. 拼接结果: [内容A][重叠区域][内容D]

优化:

  1. 与第三张图片特征匹配时,内容A不参与匹配

  2. 倒序检测

  3. 顶部导航栏与底部安全区优化

技术方案:

  1. APP添加Target - Broadcast Upload Extension

Broadcast Upload Extension 其实是用来做录屏才会用到的。

因为大家都是通过视频流来获取图片的。

不知道是哪个天才的人,想到这个来做长截图。

  1. 主APP 接受Target传递的 CVPixelBuffer

这其实是视频的中的图片帧,可以转为UIImage

  1. 拼接

前两步都比较容易实现,我认为这里才是难点,甚至超出了iOS的技术栈。

将输入的 UIImage 转换为 OpenCV 的 cv::Mat 格式

OpenCV 内部处理拼接;

先看效果:

需要源码的可以私我获取完整拼图Demo源码。

设置页面滑动时顶部的导航是会变化的,而且还有顶部还有blur变化(iOS26是玻璃效果),我觉得是一个很复杂的场景,但是这套算法跑起来表现很优秀。

接入OpenCV也遇到了一些问题,编译一直失败,发现OpenCV的头文件声明要在最顶部。

算法也是优化了五六个版本,比如处理拼接处模糊、遮挡、缺失等问题。最后采用的是一套组合算法搭配使用;

  • 智能区域匹配算法:
    • 图像预处理: 将输入的 UIImage 转换为 OpenCV 的 cv::Mat 格式。

    • 特征点检测与描述: 使用 ORB (Oriented FAST and Rotated BRIEF) 算法在两张待拼接的图片中寻找特征点。ORB 是一种高效且免费的特征检测算法,非常适合移动端应用。

    • 动态 ROI (Region of Interest) 限定: 这是算法的精髓。对于第一张图片(即已拼接好的结果),我们只在其 底部新生成的内容区域 (由 activeRegionHeight 参数指定)进行特征点检测。对于第二张新图片,则在其 顶部区域 进行检测。这精确地实现了"避免重复匹配"的需求,极大地提高了匹配的准确性和效率。

    • 特征点匹配: 使用 Brute-Force Matcher (暴力匹配) 配合 汉明距离 (Hamming Distance) 来寻找两组特征点之间的最佳匹配对。

    • 误匹配对筛选 (RANSAC): 匹配的特征点对中难免存在噪声和错误。我们使用 RANSAC (Random Sample Consensus) 算法来提纯匹配结果。它通过迭代找到一个能解释最多匹配点的几何变换模型(在这里是垂直位移),从而剔除掉那些不符合该模型的"局外点"。

    • 计算精确位移: 从经过 RANSAC 筛选后的优质匹配点对中,计算出它们在 Y 轴上的位移(offset)的中位数。使用中位数可以进一步排除极端异常值的影响,得到一个非常稳健的垂直偏移量。

    • 图像裁剪与合并:

      • 根据计算出的精确位移,确定两张图片的重叠区域。
      • 为了实现平滑过渡,我们采用 30/70 的非对称裁剪策略 。从重叠区域的 30% 位置作为"接缝",分别裁剪第一张图的上方内容和第二张图的下方内容。这保留了更多第二张图的顶部信息,有效解决了之前版本中第二张图顶部被过度裁剪的问题。
      • 最后,将裁剪后的两部分图像垂直拼接( cv::vconcat )成一张新的 cv::Mat 。
    • 结果返回: 将最终拼接好的 cv::Mat 转换回 UIImage ,并更新 activeRegionHeight (新生成内容的高度),为下一次迭代做准备。

总而言之,本项目成功地将经典的计算机视觉特征匹配流程,与针对长截图拼接场景的特定优化(动态 ROI、非对称裁剪)相结合,构建了一个健壮、准确的智能拼接引擎。

需要源码的可以私我获取完整拼图Demo。

转载声明:微信公众号《独立开发者基地》

相关推荐
Elylicery6 小时前
【职业】算法与数据结构专题
数据结构·算法
岁月静好20256 小时前
Leetcode二分查找(3)
算法·leetcode·职场和发展
一支鱼6 小时前
leetcode-4-寻找两个正序数组的中位数
算法·leetcode·typescript
独行soc7 小时前
2025年渗透测试面试题总结-42(题目+回答)
android·数据库·安全·adb·面试·渗透测试·sqlite
Christo37 小时前
TSMC-1987《Convergence Theory for Fuzzy c-Means: Counterexamples and Repairs》
人工智能·算法·机器学习·kmeans
雷达学弱狗7 小时前
广度优先搜索(BFS, Breadth-First Search)
数据结构·算法·宽度优先
AndrewHZ7 小时前
【游戏开发】街景风格化运用到游戏中,一般有哪些风格可供选择?
算法·游戏·风格迁移·手游·风格化·游戏街景·k帧
千里马学框架8 小时前
安卓15 audio新专题发布:安卓系统手机车机音频audio子系统深入实战开发专题
android·智能手机·音视频
玉木子8 小时前
机器算法(五)模型选择与调优
人工智能·python·深度学习·算法·机器学习