2012-04-05 27 views
27

我正在使用核心圖像,並希望對所選圖像產生黑白效果。什麼是最好的核心圖像過濾器來產生黑色和白色的效果?

理想情況下,我希望能夠訪問Photoshop中可用的相同選項,即Reds,Cyan,Greens,Blues和Magenta。目標是創造不同類型的黑白效果。

有誰知道什麼過濾器將是最好的操縱這些類型的選項?如果沒有人知道使用其他濾鏡創建黑白效果的好方法嗎?

由於

奧利弗

回答

54
- (UIImage *)imageBlackAndWhite 
{ 
    CIImage *beginImage = [CIImage imageWithCGImage:self.CGImage]; 

    CIImage *blackAndWhite = [CIFilter filterWithName:@"CIColorControls" keysAndValues:kCIInputImageKey, beginImage, @"inputBrightness", [NSNumber numberWithFloat:0.0], @"inputContrast", [NSNumber numberWithFloat:1.1], @"inputSaturation", [NSNumber numberWithFloat:0.0], nil].outputImage; 
    CIImage *output = [CIFilter filterWithName:@"CIExposureAdjust" keysAndValues:kCIInputImageKey, blackAndWhite, @"inputEV", [NSNumber numberWithFloat:0.7], nil].outputImage; 

    CIContext *context = [CIContext contextWithOptions:nil]; 
    CGImageRef cgiimage = [context createCGImage:output fromRect:output.extent]; 
    //UIImage *newImage = [UIImage imageWithCGImage:cgiimage]; 
    UIImage *newImage = [UIImage imageWithCGImage:cgiimage scale:image.scale orientation:image.imageOrientation]; 
    CGImageRelease(cgiimage); 

    return newImage; 
} 

UPD:對於iOS6CIColorMonochrome過濾器,但我打了它,發現它並不像我那麼好。

+0

很高興幫助:) – Shmidt 2012-09-25 17:12:16

+1

如果有人有興趣。我用它在這裏https://github.com/codler/Battery-Time-Remaining/commit/4d0ce73d7b1e954fefba7cbda339b67d77a405d0 – Codler 2012-09-25 18:06:17

+0

它不適用於OS X 10.10優勝美地了=( – Codler 2014-10-18 10:15:32

7

在創建純單色效果,我使用CIColorMatrix與R,G和B向量參數都設置爲(0.2125,0.7154,0.0721,0),以及alpha和偏向量保留其默認值。

這些值是RGB到灰度轉換系數,我在某些時候在互聯網上查找。通過改變這些係數,您可以改變輸入通道的貢獻。通過縮放矢量的每個副本,並可選擇設置偏向量,可以對輸出進行顏色校正。

13

我這裏是用CIColorMonochrome

- (UIImage *)imageBlackAndWhite 
{ 
    CIImage *beginImage = [CIImage imageWithCGImage:self.CGImage]; 

    CIImage *output = [CIFilter filterWithName:@"CIColorMonochrome" keysAndValues:kCIInputImageKey, beginImage, @"inputIntensity", [NSNumber numberWithFloat:1.0], @"inputColor", [[CIColor alloc] initWithColor:[UIColor whiteColor]], nil].outputImage; 

    CIContext *context = [CIContext contextWithOptions:nil]; 
    CGImageRef cgiimage = [context createCGImage:output fromRect:output.extent]; 
    UIImage *newImage = [UIImage imageWithCGImage:cgiimage scale:self.scale orientation:self.imageOrientation]; 

    CGImageRelease(cgiimage); 

    return newImage; 
} 
+0

'inputIntensity'默認爲'1',不需要s等手動。 – 2015-06-29 09:18:00

4

這裏是頂部額定溶液轉化爲夫特( iOS 7以上):

func blackAndWhiteImage(image: UIImage) -> UIImage { 
    let context = CIContext(options: nil) 
    let ciImage = CoreImage.CIImage(image: image)! 

    // Set image color to b/w 
    let bwFilter = CIFilter(name: "CIColorControls")! 
    bwFilter.setValuesForKeysWithDictionary([kCIInputImageKey:ciImage, kCIInputBrightnessKey:NSNumber(float: 0.0), kCIInputContrastKey:NSNumber(float: 1.1), kCIInputSaturationKey:NSNumber(float: 0.0)]) 
    let bwFilterOutput = (bwFilter.outputImage)! 

    // Adjust exposure 
    let exposureFilter = CIFilter(name: "CIExposureAdjust")! 
    exposureFilter.setValuesForKeysWithDictionary([kCIInputImageKey:bwFilterOutput, kCIInputEVKey:NSNumber(float: 0.7)]) 
    let exposureFilterOutput = (exposureFilter.outputImage)! 

    // Create UIImage from context 
    let bwCGIImage = context.createCGImage(exposureFilterOutput, fromRect: ciImage.extent) 
    let resultImage = UIImage(CGImage: bwCGIImage, scale: 1.0, orientation: image.imageOrientation) 

    return resultImage 
} 
2

這裏是@Shmidt最喜歡的答案寫成UIImage的擴展與斯威夫特性能更新:

import CoreImage 

extension UIImage 
{ 
    func imageBlackAndWhite() -> UIImage? 
    { 
     if let beginImage = CoreImage.CIImage(image: self) 
     { 
      let paramsColor: [String : AnyObject] = [kCIInputBrightnessKey: NSNumber(double: 0.0), 
                kCIInputContrastKey: NSNumber(double: 1.1), 
                kCIInputSaturationKey: NSNumber(double: 0.0)] 
      let blackAndWhite = beginImage.imageByApplyingFilter("CIColorControls", withInputParameters: paramsColor) 

      let paramsExposure: [String : AnyObject] = [kCIInputEVKey: NSNumber(double: 0.7)] 
      let output = blackAndWhite.imageByApplyingFilter("CIExposureAdjust", withInputParameters: paramsExposure) 

      let processedCGImage = CIContext().createCGImage(output, fromRect: output.extent) 
      return UIImage(CGImage: processedCGImage, scale: self.scale, orientation: self.imageOrientation) 
     } 
     return nil 
    } 
} 
0

的MacOS(NSImage中)斯威夫特3版@ FBente的轉換@ Shmidt的回答的:

extension NSImage 
{ 
    func imageBlackAndWhite() -> NSImage? 
    { 
     if let cgImage = self.cgImage(forProposedRect: nil, context: nil, hints: nil) 
     { 
      let beginImage = CIImage.init(cgImage: cgImage) 
      let paramsColor: [String : AnyObject] = [kCIInputBrightnessKey: NSNumber(value: 0.0), 
                kCIInputContrastKey: NSNumber(value: 1.1), 
                kCIInputSaturationKey: NSNumber(value: 0.0)] 
      let blackAndWhite = beginImage.applyingFilter("CIColorControls", withInputParameters: paramsColor) 

      let paramsExposure: [String : AnyObject] = [kCIInputEVKey: NSNumber(value: 0.7)] 
      let output = blackAndWhite.applyingFilter("CIExposureAdjust", withInputParameters: paramsExposure) 

      if let processedCGImage = CIContext().createCGImage(output, from: output.extent) { 
       return NSImage(cgImage: processedCGImage, size: self.size) 
      } 
     } 
     return nil 
    } 
} 
0

我已經嘗試了Shmidt解決方案,但它在我看來也超過了暴露在iPad Pro上。我只使用他的解決方案的第一部分,沒有曝光過濾器:

- (UIImage *)imageBlackAndWhite 
{ 
    CIImage *beginImage = [CIImage imageWithCGImage:self.CGImage]; 

    CIImage *blackAndWhite = [CIFilter filterWithName:@"CIColorControls" keysAndValues:kCIInputImageKey, beginImage, @"inputBrightness", [NSNumber numberWithFloat:0.0], @"inputContrast", [NSNumber numberWithFloat:1.1], @"inputSaturation", [NSNumber numberWithFloat:0.0], nil].outputImage; 
    CIImage *output = [blackAndWhite valueForKey:@"outputImate"]; 

    CIContext *context = [CIContext contextWithOptions:nil]; 
    CGImageRef cgiimage = [context createCGImage:output fromRect:output.extent]; 
    //UIImage *newImage = [UIImage imageWithCGImage:cgiimage]; 
    UIImage *newImage = [UIImage imageWithCGImage:cgiimage scale:image.scale orientation:image.imageOrientation]; 
    CGImageRelease(cgiimage); 

    return newImage; 
} 
相關問題