CIFilter 的 randomGenerator() 产生模式

问题描述 投票:0回答:1

我正在尝试模仿苹果这里所做的老式胶片颗粒效果。问题在于覆盖颗粒图像,当我合成它并将其裁剪为原始图像的大小时,我得到了一堆奇怪的图案 - 这在多个图像和尺寸中是一致的,我已将颗粒图像应用到普通图像有助于显示效果。

如您所见,有一致的垂直和水平图案,几乎像网格一样。为什么会发生这种情况以及如何防止它发生?

谷物发生器功能:

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 图像中,没有图案。

swift cifilter
1个回答
0
投票

CIRandomGenerator
生成的图案正在重复。从您链接的示例网站:

CIRandomGenerator
输出的图像始终相同;即使您重新设置随机数生成器的种子,该过滤器的图像输出也始终是相同的 512x512 模式。不过,它适合赋予随机性的外观。

这意味着图案每 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
© www.soinside.com 2019 - 2024. All rights reserved.