长图拼接完美,完全可以媲美应用市场上的软件。
(因为是C++的算法,所以平台通用,如果你是独立开发者,可以用来上架APP)
由于iOS没有系统自带的长截图功能,所以只能用第三方的,AppStore上有几款好用的长截图APP,都需要付费使用,而且还不便宜。
比如:
- Picsew 8元 - 15元;
- 滚动截图 8元-48元;
- Stitch 68元;

收费都很贵,那我想自己是不是可以做一个类似的软件来付费呢?
找了一些长截图的技术文章,发现似乎还真没有公开的技术方案,好像大家都藏着掖着的。
不过好在经历了几天的失败后,终于成功了。
核心拼接思想:
-
第一张图片: [内容A][重叠区域][内容B]
-
第二张图片: [内容C][重叠区域][内容D]
-
图片正序或者倒序不影响结果
-
拼接结果: [内容A][重叠区域][内容D]
优化:
-
与第三张图片特征匹配时,内容A不参与匹配
-
倒序检测
-
顶部导航栏与底部安全区优化
技术方案:
- APP添加Target - Broadcast Upload Extension
Broadcast Upload Extension 其实是用来做录屏才会用到的。
因为大家都是通过视频流来获取图片的。
不知道是哪个天才的人,想到这个来做长截图。
- 主APP 接受Target传递的 CVPixelBuffer
这其实是视频的中的图片帧,可以转为UIImage
- 拼接
前两步都比较容易实现,我认为这里才是难点,甚至超出了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。
转载声明:微信公众号《独立开发者基地》