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。

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

相关推荐
We་ct5 分钟前
LeetCode 56. 合并区间:区间重叠问题的核心解法与代码解析
前端·算法·leetcode·typescript
Lionel68910 分钟前
分步实现 Flutter 鸿蒙轮播图核心功能(搜索框 + 指示灯)
算法·图搜索算法
小妖66614 分钟前
js 实现快速排序算法
数据结构·算法·排序算法
xsyaaaan17 分钟前
代码随想录Day30动态规划:背包问题二维_背包问题一维_416分割等和子集
算法·动态规划
crmscs20 分钟前
剪映永久解锁版/电脑版永久会员VIP/安卓SVIP手机永久版下载
android·智能手机·电脑
localbob22 分钟前
杀戮尖塔 v6 MOD整合版(Slay the Spire)安卓+PC端免安装中文版分享 卡牌肉鸽神作!杀戮尖塔中文版,电脑和手机都能玩!杀戮尖塔.exe 杀戮尖塔.apk
android·杀戮尖塔apk·杀戮尖塔exe·游戏分享
机建狂魔27 分钟前
手机秒变电影机:Blackmagic Camera + LUT滤镜包的专业级视频解决方案
android·拍照·摄影·lut滤镜·拍摄·摄像·录像
hudawei99627 分钟前
flutter和Android动画的对比
android·flutter·动画
zheyutao1 小时前
字符串哈希
算法
A尘埃1 小时前
保险公司车险理赔欺诈检测(随机森林)
算法·随机森林·机器学习