如何使用CoreImage滤镜实现灰度滤镜?

3

我使用调整为白色的CIColorMonochromeFilter创建了一个应该是正确的灰度CIFilter。在我看来,这看起来非常灰度,但我也不是专家,所以我想知道这是否是灰度滤镜的准确实现。

我还没有编写转储和测试像素的代码,但基于图像格式已经是RGB,我很好奇输出图像的格式是什么。例如,我如何知道每个像素是一个组件还是三个组件?

我知道CIImage只是图像的配方,我必须使用CGImageRef最终进行呈现。我只是不明白可以期望数据的像素格式是什么。

CIFilter * monoChromeFilter = [CIFilter filterWithName:kCIColorMonochromeFilterName];    
[monoChromeFilter setValue:self.inputImage forKey:kCIInputImageKey];

CIColor * white = [CIColor colorWithRed:1.0 green:1.0 blue:1.0];
[monoChromeFilter setValue:white forKey:kCIInputColorKey];

那么问题是什么?你不知道如何读取图像的像素值吗?这在 Stack Overflow 上已经有非常详细的文档了。 - matt
更或少,我正在做的是一个合适的灰度过滤器,例如单色白色==灰度。我对输出格式很好奇,尽管这更多是一个次要的问题。 - Joey Carson
1个回答

3

我希望这能对你有所帮助(这是Swift语言相关的内容)。

static func convertToBlackAndWhite(image:UIImage) -> UIImage?
{
        //first do color controls
        let ciImage = CIImage(image:image)
        let filter = CIFilter(name: "CIColorControls")
        filter.setValue(ciImage, forKey: kCIInputImageKey)
        filter.setValue(0.0, forKey: kCIInputBrightnessKey)
        filter.setValue(0.0, forKey: kCIInputSaturationKey)
        filter.setValue(1.1, forKey: kCIInputContrastKey)

        let intermediateImage = filter.outputImage

        let filter1 = CIFilter(name:"CIExposureAdjust")
        filter1.setValue(intermediateImage, forKey: kCIInputImageKey)
        filter1.setValue(0.7, forKey: kCIInputEVKey)
        let output = filter1.outputImage

        let context = CIContext(options: nil)
        let cgImage = context.createCGImage(output, fromRect: output.extent())

        return UIImage(CGImage: cgImage, scale: image.scale, orientation: image.imageOrientation)
}

3
谢谢您的回答。您能否详细说明一下这种方法与CIColorMonochrome滤镜方法有何不同,以及为什么需要CIExposureAdjust? - Joey Carson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接