将 UIKit 坐标转换为 Quartz/CoreImage (Swift)

Convert UIKit coordinates to Quartz/CoreImage (Swift)

有没有办法将 UIKit 坐标(0,0 左上角)转换为 Quartz/CoreImage(0,0 左下角)?在这里找不到任何 swift 相关的内容。

原点在左下角左上角,你不需要对X轴做任何事情,但你需要翻转右轴。 UIKit(或在本例中为 Core Graphics)使用 CGPoints。 Core Image 通常使用 CIVectors,它可以有 2、3 或 4 个轴角。

这是一个将 CGPoint(X,Y) 转换为 CIVector(X,Y) 的简单函数:

func createVector(_ point:CGPoint, image:CIImage) -> CIVector {
    return CIVector(x: point.x, y: image.extent.height - point.y)
}

你可以使用仿射变换矩阵,这个片段取自我的一个代码,用于从 Core Image / Core graphics 到 UIKit 的转换:

CGAffineTransform t = CGAffineTransformMakeScale(1, -1);
t = CGAffineTransformTranslate(t,0, -imageView.bounds.size.height);

基本上你需要:

  • 取反y轴
  • 根据视图高度平移原点

之后你可以使用那些几何函数来计算你的矩形或点

CGPoint pointUIKit = CGPointApplyAffineTransform(pointCI, t);
CGRect rectUIKit = CGRectApplyAffineTransform(rectCI, t);

在Swift 3.x:

var t = CGAffineTransform(scaleX: 1, y: -1)
t = t.translatedBy(x: 0, y: -imageView.bounds.size.height)
let pointUIKit = pointCI.applying(t)
let rectUIKIT = rectCI.applying(t)