2012-11-25 36 views
11

मैं आईओएस के लिए रंग पिकर बना रहा हूं। मैं उपयोगकर्ता को चमक (चमक) का चयन करने और रंगीन पहिया को इस परिवर्तन को प्रतिबिंबित करने में सक्षम बनाना चाहता हूं। मैं CIColorControls फ़िल्टर के साथ चमक को संशोधित करने के लिए कोर छवि का उपयोग कर रहा हूं। यहाँ मेरी कोड है:कोर छवि CIColorControls चमक फ़िल्टर गलत प्रभाव पैदा करता है। मैं अपनी छवि की चमक कैसे बदलूं?

-(CIImage *)oldPhoto:(CIImage *)img withBrightness:(float)intensity 
{ 
    CIFilter *lighten = [CIFilter filterWithName:@"CIColorControls"]; 
    [lighten setValue:img forKey:kCIInputImageKey]; 
    [lighten setValue:@((intensity * 2.0) - 1.0) forKey:@"inputBrightness"]; 
    return lighten.outputImage; 
} 

यहाँ कैसे रंग चक्र तीव्रता = 0.5 के साथ दिखाई देता है (inputBrightness = 0):

My image with inputBrightness = 0

समस्या रंग चक्र गलत लग रहा है वह यह है कि जब तीव्रता < 0.5। उदाहरण के लिए, यहाँ यह = 0.3 (inputBrightness = -0.4) तीव्रता के साथ कैसे दिखाई देता है:

My image with inputBrightness = -0.4

सूचना यह है कि बीच में एक काला घेरा, और छवि के बाकी या तो सही ढंग से अन्धेरा नहीं किया गया है । यह एक एचएसएल रंग पहिया माना जाता है, इसलिए मुझे लगता है कि मैं वास्तव में जो बदलना चाहता हूं वह चमक है, चमक नहीं।

सबसे पहले, क्या कोई यह समझा सकता है कि छवि इस तरह क्यों दिखती है? मैं रंग पर एक विशेषज्ञ नहीं हूँ; यह अजीब लगता है कि सर्कल का केंद्र जल्दी से काला हो जाता है जबकि इसके किनारों में ज्यादा अंधेरा नहीं होता है।

दूसरा, मैं जिस प्रभाव को प्राप्त करना चाहता हूं उसे कैसे प्राप्त कर सकता हूं?

यहाँ कैसे मैं वास्तव में छवि देखने के लिए चाहते हैं:

Image with luminance = 0.3, generated with HSL function on CPU (too slow)

यह एक कस्टम एचएसएल समारोह और luminance = 0.3 के साथ बनाया गया था। यह सीपीयू पर चलता है, इसलिए यह मेरी जरूरतों के लिए बहुत धीमी है। मुझे इस एचएसएल फ़ंक्शन के लिए कोड पोस्ट करने में खुशी होगी, लेकिन मैंने इसे शामिल नहीं किया क्योंकि यह तुरंत प्रासंगिक नहीं लग रहा था। अगर आप इसे देखना चाहते हैं, तो बस पूछें।

अगर आपके कोई प्रश्न हैं, तो कृपया मुझे बताएं, या अगर कुछ अस्पष्ट लगता है। धन्यवाद!

+0

अपनी समस्या को हल करने के लिए एक आसान और शायद तेज तरीका है अपनी रंगीन गोला पर एक काला घेरा आकर्षित करने के लिए है। इस काले सर्कल के लिए आप जिस अल्फा को चुनते हैं वह आपके रंगीन सर्कल की चमक को निर्धारित करता है। सभी रंगों को पुन: सम्मिलित करने की आवश्यकता नहीं है। – mmgp

+0

जब आप अपना सीआईसीएन्टेक्स्ट – ccgus

उत्तर

2

इस परिवर्तन मूल्य एक स्लाइडर का उपयोग करके देखें और: -

- (void)viewDidLoad{ 

    UIImage *aUIImage = showPickedImageView.image; 
    CGImageRef aCGImage = aUIImage.CGImage; 
    aCIImage = [CIImage imageWithCGImage:aCGImage]; 


    context = [[CIContext contextWithOptions:nil] retain]; 
    brightnessFilter = [[CIFilter filterWithName:@"CIColorControls" keysAndValues: @"inputImage", aCIImage, nil] retain]; 

} 

- (IBAction)brightnessSliderValueChanged:(id)sender { 

    [brightnessFilter setValue:[NSNumber numberWithFloat:brightnessSlider.value ] forKey: @"inputBrightness"]; 
    outputImage = [brightnessFilter outputImage]; 
    CGImageRef cgiig = [context createCGImage:outputImage fromRect:[outputImage extent]]; 
    newUIImage = [UIImage imageWithCGImage:cgiig]; 
    CGImageRelease(cgiig); 
    [showPickedImageView setImage:newUIImage]; 
} 
+0

सेट करते हैं तो अपने काम करने वाले रंगस्थान को आरजीबी रैखिक में बदलने का प्रयास करें, यह प्रश्न का उत्तर नहीं देता है। यह एक ही फिल्टर, 'CIColorControls' को नियोजित करता है, जिसे उन्होंने प्रश्न में शामिल दूसरे नमूने को उत्पन्न करते समय उपयोग किया था। यह उत्तर केवल समस्या को पुन: उत्पन्न करता है और इसे हल नहीं करता है। – Rob

+1

मेरे मामले में मैंने अच्छा काम करने में मेरी मदद की –

4

मैं भी CIColorControls की kCIInputBrightnessKey के गैर linearity पाया कष्टप्रद हो सकता है।

/** Change luminosity of `CIImage` 

@param inputImage The `CIImage` of the image to have it's luminosity changed. 
@param luminosity The percent change of the luminosity, ranging from -1.0 to 1.0. 

@return `CIImage` of image with luminosity changed. If luminosity of 0.0 used, original `inputImage` is returned. 
*/ 

- (CIImage *)changeLuminosityOfCIImage:(CIImage *)inputImage luminosity:(CGFloat)luminosity 
{ 
    if (luminosity == 0) 
     return inputImage; 

    NSParameterAssert(luminosity >= -1.0 && luminosity <= 1.0); 

    CIFilter *toneCurveFilter = [CIFilter filterWithName:@"CIToneCurve"]; 
    [toneCurveFilter setDefaults]; 
    [toneCurveFilter setValue:inputImage forKey:kCIInputImageKey]; 

    if (luminosity > 0) 
    { 
     [toneCurveFilter setValue:[CIVector vectorWithX:0.0 Y:luminosity]       forKey:@"inputPoint0"]; 
     [toneCurveFilter setValue:[CIVector vectorWithX:0.25 Y:luminosity + 0.25 * (1 - luminosity)] forKey:@"inputPoint1"]; 
     [toneCurveFilter setValue:[CIVector vectorWithX:0.50 Y:luminosity + 0.50 * (1 - luminosity)] forKey:@"inputPoint2"]; 
     [toneCurveFilter setValue:[CIVector vectorWithX:0.75 Y:luminosity + 0.75 * (1 - luminosity)] forKey:@"inputPoint3"]; 
     [toneCurveFilter setValue:[CIVector vectorWithX:1.0 Y:1.0]         forKey:@"inputPoint4"]; 
    } 
    else 
    { 
     [toneCurveFilter setValue:[CIVector vectorWithX:0.0 Y:0.0]      forKey:@"inputPoint0"]; 
     [toneCurveFilter setValue:[CIVector vectorWithX:0.25 Y:0.25 * (1 + luminosity)] forKey:@"inputPoint1"]; 
     [toneCurveFilter setValue:[CIVector vectorWithX:0.50 Y:0.50 * (1 + luminosity)] forKey:@"inputPoint2"]; 
     [toneCurveFilter setValue:[CIVector vectorWithX:0.75 Y:0.75 * (1 + luminosity)] forKey:@"inputPoint3"]; 
     [toneCurveFilter setValue:[CIVector vectorWithX:1.0 Y:1 + luminosity]   forKey:@"inputPoint4"]; 
    } 

    return [toneCurveFilter outputImage]; 
} 

यहाँ, अपनी छवि है ऊपर दिनचर्या का उपयोग कर 30% की चमक को कम करने:

reduced

यह CIToneCurve साथ किया जा सकता मैं एक रेखीय CIToneCurve नियुक्त किया था। चाहे यह आपके दिनचर्या से तेज़ हो, आप इसे बेंचमार्क करेंगे।

1

आपका CIColorControls फ़िल्टर डिज़ाइन के रूप में काम कर रहा है। यह बस प्रत्येक पिक्सेल के लाल, हरे और नीले मानों में इसका चमक पैरामीटर जोड़ता है। यदि नकारात्मक चमक 0 से नीचे पिक्सेल लेती है, तो यह काला हो जाती है। यदि एक सकारात्मक चमक इसे 1 से अधिक धक्का देती है, तो यह सफेद हो जाती है। (दरअसल, प्रत्येक चैनल अलग से क्लिप करता है ...)

एक और मुद्दा यह है कि सीआईसीओलर कंट्रोल आरजीबी रंग अंतरिक्ष में काम करता है। एचएसएल बहुत अलग है।यही कारण है कि आपका बेस कलर व्हील मानक ऐप्पल रंग पिकर से बहुत अलग दिखता है।

Useful reference