What is the best Core Image filter to produce black and white effects?

后端 未结 8 811
-上瘾入骨i
-上瘾入骨i 2020-11-29 20:16

I am using Core Image and would like to produce a black and white effect on the chosen image.

Ideally I would like to have access to the same sort of options that a

相关标签:
8条回答
  • 2020-11-29 20:18

    here is example with 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 讨论(0)
  • 2020-11-29 20:21

    With regard to the answers suggesting to use CIColorMonochrome: There now are a few dedicated grayscale filters available from iOS7 (and OS X 10.9):

    • CIPhotoEffectTonal

      imitate black-and-white photography film without significantly altering contrast.

    • CIPhotoEffectNoir:

      imitate black-and-white photography film with exaggerated contrast

    Source: https://developer.apple.com/library/mac/documentation/GraphicsImaging/Reference/CoreImageFilterReference/index.html

    0 讨论(0)
  • 2020-11-29 20:21

    Here is the most liked answer from @Shmidt written as an UIImage extension with a performance update in Swift:

    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 讨论(0)
  • 2020-11-29 20:23

    Here is the top rated solution converted to Swift (iOS 7 and above):

    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
    }
    
    0 讨论(0)
  • 2020-11-29 20:26

    macOS (NSImage) Swift 3 version of @FBente's conversion of @Shmidt's answer:

    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 讨论(0)
  • 2020-11-29 20:27
    - (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.: For iOS6 there is CIColorMonochrome filter, but I played with it and found it not so good as mine.

    0 讨论(0)
提交回复
热议问题