cocoa - काले और सफेद प्रभाव पैदा करने के लिए सबसे अच्छा कोर छवि फ़िल्टर क्या है?




ios5 core-image (6)

मैंने श्मिट समाधान का प्रयास किया है लेकिन यह मुझे आईपैड प्रो पर उजागर होने पर भी दिखाई देता है। मैं एक्सपोजर फ़िल्टर के बिना, अपने समाधान के पहले भाग का उपयोग कर रहा हूं:

- (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;
}

मैं कोर छवि का उपयोग कर रहा हूं और चुने हुए छवि पर एक काला और सफेद प्रभाव उत्पन्न करना चाहता हूं।

आदर्श रूप से मैं उसी प्रकार के विकल्पों तक पहुंच प्राप्त करना चाहता हूं जो फ़ोटोशॉप यानी रेड, सायन, ग्रीन्स, ब्लूज़ और मैजेंटा पर उपलब्ध हैं। लक्ष्य काले और सफेद प्रभाव के विभिन्न प्रकार बनाने के लिए किया जा रहा है।

क्या किसी को पता है कि इस तरह के विकल्पों में हेरफेर करने के लिए कौन सा फ़िल्टर सबसे अच्छा होगा? अगर किसी को अन्य फिल्टर का उपयोग करके काले और सफेद प्रभाव बनाने के लिए एक अच्छा दृष्टिकोण नहीं पता है?

धन्यवाद

ओलिवर


मैकोज़ (एनएसआईमेज) @ एफबीएनटी के @ श्मिट के जवाब के रूपांतरण के स्विफ्ट 3 संस्करण:

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
    }
}

यहां स्विफ्ट (आईओएस 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
}

शुद्ध मोनोक्रोम प्रभाव बनाने के लिए, मैंने CIColorMatrix उपयोग आर, जी और बी वेक्टर पैरामीटर के साथ किया है जो सभी सेट (0.2125, 0.7154, 0.0721, 0) पर सेट किए गए हैं, और अल्फा और पूर्वाग्रह वैक्टर उनके डिफ़ॉल्ट के साथ छोड़े गए हैं।

मूल्य आरजीबी हैं जो रूपांतरण गुणांक को greyscale करने के लिए मैंने कुछ बिंदुओं पर internets पर देखा। इन गुणांक को बदलकर, आप इनपुट चैनलों का योगदान बदल सकते हैं। वेक्टर की प्रत्येक प्रति स्केल करके, और वैकल्पिक रूप से पूर्वाग्रह वेक्टर सेट करके, आप आउटपुट को रंगीन कर सकते हैं।


CIColorMonochrome का उपयोग करने के सुझावों के संबंध में: अब CIColorMonochrome (और ओएस एक्स 10.9) से उपलब्ध कुछ समर्पित ग्रेस्केल फ़िल्टर हैं:

  • CIPhotoEffectTonal

    महत्वपूर्ण रूप से विपरीत परिवर्तन किए बिना काले और सफेद फोटोग्राफी फिल्म की नकल करें।

  • CIPhotoEffectNoir:

    अतिरंजित विपरीत के साथ काले और सफेद फोटोग्राफी फिल्म की नकल करें

स्रोत: https://developer.apple.com/library/mac/documentation/GraphicsImaging/Reference/CoreImageFilterReference/index.html


- (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;
}

अपडेटेडः आईओएस 6 के लिए CIColorMonochrome फिल्टर है, लेकिन मैंने इसके साथ खेला और पाया कि यह मेरे जैसा इतना अच्छा नहीं है।