将 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)
有没有办法将 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)