如何应用 CIVignette 就好像 CIImage 是方形的一样?

问题描述

我有一个 1080x1920 CIImage 并希望应用 CIVignette,就像图像是方形的一样(模仿相机镜头)。

我是 CoreImage 的新手,想知道如何将我的 extentCIImage 临时更改为 1920x1920。 (但我不确定是否需要这样做。)

我可以左右复制粘贴原始图像的两个窄条,然后复制粘贴 CICrop,但这似乎很麻烦。

有什么想法吗?

解决方法

您可以结合使用 clampedToExtent(这会导致图像无限重复其边界像素)和 cropped 来使图像变为方形。然后您可以应用小插图并将结果裁剪回原始范围:

// "crop" to square,placing the image in the middle
let longerSize = max(inputImage.extent.width,inputImage.extent.height)
let xOffset = (longerSize - inputImage.extent.width) / 2.0
let yOffset = (longerSize - inputImage.extent.height) / 2.0
let squared = inputImage.clampedToExtent().cropped(to: CGRect(x: -xOffset,y: -yOffset,width: longerSize,height: longerSize))

// apply vignette
let vignetteFilter = CIFilter(name: "CIVignette")!
vignetteFilter.setValue(squared,forKey: kCIInputImageKey)
vignetteFilter.setValue(1.0,forKey: kCIInputIntensityKey)
vignetteFilter.setValue(1.0,forKey: kCIInputRadiusKey)
let withVignette = vignetteFilter.outputImage!

// crop back to original extent
let output = withVignette.cropped(to: inputImage.extent)