2015-10-09 214 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是必要的? –