使用 CGAffineTransformMakeRotation 在 Swift 2 中旋转 CIImage
Rotate CIImage in Swift 2 using CGAffineTransformMakeRotation
我尝试使用
在 Swift2 中旋转 CIImage
let rotatedImage = someCIImage.imageByApplyingTransform(CGAffineTransformMakeRotation(CGFloat(M_PI / 2.0))))
当我查看生成的矩形的大小时,它已被旋转。 (它是 1000x500,现在是 500x1000)。但是,我随后进行的计算(转换为位图并访问单个像素)表示不同。上面的变换围绕图像的中心旋转是正确的吗,即在上面的例子中大约 500/250?
该变换围绕图像的原点旋转。此版本将枢轴点设置为中心:
var tx = CGAffineTransformMakeTranslation(
image.extent.width / 2,
image.extent.height / 2)
tx = CGAffineTransformRotate(
tx,
CGFloat(M_PI_2))
tx = CGAffineTransformTranslate(
tx,
-image.extent.width / 2,
-image.extent.height / 2)
var transformImage = CIFilter(
name: "CIAffineTransform",
withInputParameters: [
kCIInputImageKey: image,
kCIInputTransformKey: NSValue(CGAffineTransform: tx)])!.outputImage!
西蒙
在Swift5中,代码变得更好了。这是一种 CIImage
扩展方法,可以轻松地围绕中心旋转。
func rotate(_ angle: CGFloat) -> CIImage {
let transform = CGAffineTransform(translationX: extent.midX, y: extent.midY)
.rotated(by: angle)
.translatedBy(x: -extent.midX, y: -extent.midY)
return applyingFilter("CIAffineTransform", parameters: [kCIInputTransformKey: transform])
}
我尝试使用
在 Swift2 中旋转 CIImagelet rotatedImage = someCIImage.imageByApplyingTransform(CGAffineTransformMakeRotation(CGFloat(M_PI / 2.0))))
当我查看生成的矩形的大小时,它已被旋转。 (它是 1000x500,现在是 500x1000)。但是,我随后进行的计算(转换为位图并访问单个像素)表示不同。上面的变换围绕图像的中心旋转是正确的吗,即在上面的例子中大约 500/250?
该变换围绕图像的原点旋转。此版本将枢轴点设置为中心:
var tx = CGAffineTransformMakeTranslation(
image.extent.width / 2,
image.extent.height / 2)
tx = CGAffineTransformRotate(
tx,
CGFloat(M_PI_2))
tx = CGAffineTransformTranslate(
tx,
-image.extent.width / 2,
-image.extent.height / 2)
var transformImage = CIFilter(
name: "CIAffineTransform",
withInputParameters: [
kCIInputImageKey: image,
kCIInputTransformKey: NSValue(CGAffineTransform: tx)])!.outputImage!
西蒙
在Swift5中,代码变得更好了。这是一种 CIImage
扩展方法,可以轻松地围绕中心旋转。
func rotate(_ angle: CGFloat) -> CIImage {
let transform = CGAffineTransform(translationX: extent.midX, y: extent.midY)
.rotated(by: angle)
.translatedBy(x: -extent.midX, y: -extent.midY)
return applyingFilter("CIAffineTransform", parameters: [kCIInputTransformKey: transform])
}