2015-10-09 175 views
1

我创建了我认为应该使用调整为白色的CIColorMonochromeFilter的合适灰度级CIFilter。这对我来说看起来很灰色,但我不是专家,所以我只是想知道这是否是灰度滤镜的准确实现。如何使用CoreImage过滤器实现灰度过滤器?

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

我知道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]; 
+0

那么,有什么问题吗?仅仅是你不知道如何读取图像的像素值?这在堆栈溢出中有很好的记录。 – matt

+0

或多或少,我所做的实际上是一个合适的灰度过滤器,例如单色白色==灰度。我很好奇输出格式,但这更多的是次要问题。 –

回答

2

我希望这能对您有所帮助(它的迅速。)

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) 
} 
+0

感谢您的回答。你能否详细说明这种方法与CIColorMonochrome滤波器方法有何不同,以及为什么CIExposureAdjust是必要的? –