ios - कोर छवि CIColorControls चमक फ़िल्टर गलत प्रभाव बनाता है। मैं अपनी छवि की चमक को कैसे बदलूं?




ios5 graphics (2)

मुझे भी kCIInputBrightnessKey के CIColorControls की गैर-रैखिकता को परेशान करने के लिए मिला। मैंने एक रैखिक CIToneCurve नियोजित:

/** 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% तक कम करें:

यह CIToneCurve साथ किया जा सकता है चाहे यह आपकी रूटीन से अधिक तेज़ हो, आपके पास बेंचमार्क होगा

I आईओएस के लिए एक रंग पिकर बना रहा हूँ मैं उपयोगकर्ता को चमक (ल्यूमिनेंस) चुनने के लिए सक्षम करना चाहूंगा और रंग पहिया इस परिवर्तन को दर्शाता है। मैं 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 (इनपुटब्राइटनेस = 0) के साथ कैसे दिखता है:

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

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

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

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

यहां बताया गया है कि मैं वास्तव में छवि को देखना चाहता हूं:

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

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


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

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

उपयोगी संदर्भ





core-image