我正在尝试模仿苹果这里所做的老式胶片颗粒效果。问题在于覆盖颗粒图像,当我合成它并将其裁剪为原始图像的大小时,我得到了一堆奇怪的图案 - 这在多个图像和尺寸中是一致的,我已将颗粒图像应用到普通图像有助于显示效果。
如您所见,有一致的垂直和水平图案,几乎像网格一样。为什么会发生这种情况以及如何防止它发生?
谷物发生器功能:
private func applyRandomGrain() {
/// generate grain & convert to grayscale
let grainGenerator = CIFilter.randomGenerator()
let grayscale = CIFilter.minimumComponent()
grayscale.inputImage = grainGenerator.outputImage
/// adjust brightness of grain image
let exposureFilter = CIFilter.exposureAdjust()
exposureFilter.inputImage = grayscale.outputImage
exposureFilter.ev = Float(settings.grainExposure)
/// adjust intensity of grain image with opacity
let alphaVector = CIVector(x: 0, y: 0, z: 0, w: settings.grainOpacity)
let alphaFilter = CIFilter.colorMatrix()
alphaFilter.inputImage = exposureFilter.outputImage
alphaFilter.aVector = alphaVector
guard let inputImage = outputImage else {
return
}
/// apply grain image to original image
let composite = CIFilter.sourceOverCompositing()
composite.backgroundImage = inputImage
composite.inputImage = alphaFilter.outputImage
guard let imageWithGrain = composite.outputImage else {
return
}
outputImage = imageWithGrain.cropped(to: inputImage)
}
编辑:示例图像是 1920x2560 - 我观察到图像越大,图案就越多。在 100x100 图像中,没有图案。
由
CIRandomGenerator
生成的图案正在重复。从您链接的示例网站:
从
输出的图像始终相同;即使您重新设置随机数生成器的种子,该过滤器的图像输出也始终是相同的 512x512 模式。不过,它适合赋予随机性的外观。CIRandomGenerator
这意味着图案每 512 个像素重复一次。这就是为什么您看不到较小图像的强烈效果。
如果你想要“真实”、不重复的随机性,你必须实现自己的过滤器内核。例如,实现 Perlin 噪声的一个。
或者,如果您不介意使用 Apple 的内部滤镜(这是一个很大的 if),您可以使用
CIPhotoGrain
滤镜来实现这一点:模拟由高 ISO 值引起的照片颗粒效果。
let filter = CIFilter(name: "CIPhotoGrain")!
filter.setValue(image, forKey: kCIInputImageKey)
filter.setValue(42, forKey: "inputSeed") // random seed
filter.setValue(1.0, forKey: "inputAmount")
filter.setValue(2000, forKey: "inputISO")
let output = filter.outputImage