如何应用 CIVignette 就好像 CIImage 是正方形的?
How to apply CIVignette as if CIImage were square?
我有一个 1080x1920 CIImage
并希望应用 CIVignette
就像图像是方形的(模仿相机镜头)。
我是 CoreImage 的新手,想知道如何暂时将 CIImage
的 extent
更改为 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)
我有一个 1080x1920 CIImage
并希望应用 CIVignette
就像图像是方形的(模仿相机镜头)。
我是 CoreImage 的新手,想知道如何暂时将 CIImage
的 extent
更改为 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)