MacOS下CGImage.cropping(to:)裁剪结果异常问题求助
问题原因与解决方案
核心问题:坐标系不匹配
你遇到的错误裁剪结果,根源是坐标系原点方向不一致:
- Vision框架(包括
VNImageRectForNormalizedRect转换后的矩形)使用左上角为原点的坐标系(和UIKit/AppKit的显示坐标系一致) CGImage.cropping(to:)遵循Core Graphics规则,使用左下角为原点的坐标系,Y轴方向与前者完全相反
直接用Vision输出的矩形调用cropping(to:),会导致Y轴位置完全偏移,出现错误的裁剪结果。
修复代码
在调用cgImage.cropping(to:)前,将矩形的Y坐标转换为CGImage兼容的坐标系即可:
for (index, observation) in observations.enumerated() { let normalizedBoundingBox = observation.boundingBox let boundingBox = VNImageRectForNormalizedRect(normalizedBoundingBox, cgImage.width, cgImage.height) // 转换Y坐标适配CGImage的左下角原点坐标系 let cgCroppingRect = CGRect( x: boundingBox.origin.x, y: cgImage.height - boundingBox.origin.y - boundingBox.height, width: boundingBox.width, height: boundingBox.height ) let croppedImage = cgImage.cropping(to: cgCroppingRect)! // 存储裁剪后的图像 }
临时方案有效的原因
你通过Core Graphics Context绘制的临时修复方案,本质是通过设置负的Y偏移(-boundingBox.minY),抵消了CGContext坐标系与显示坐标系的Y轴差异,相当于手动完成了坐标系翻转,因此能得到正确的裁剪区域。
验证方式
可以打印转换前后的矩形参数对比,直观看到坐标系差异:
print("Vision转换后的矩形:\(boundingBox)") print("CGImage适配后的矩形:\(cgCroppingRect)")
内容的提问来源于stack exchange,提问作者Lucas Paim
相关产品推荐
相关产品推荐

