使用 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])
}