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

How to apply CIVignette as if CIImage were square?

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

我是 CoreImage 的新手,想知道如何暂时将 CIImageextent 更改为 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)