2010-01-27 8 views
18

मैं रनटाइम पर मनमाना NSColor मानों को उलटा करने का एक तरीका ढूंढ रहा हूं, और ऐसा करने के लिए कोई भी अंतर्निहित विधि प्रतीत नहीं होती है।क्या एनएससीओलर मूल्यों को बदलने के लिए एक पारंपरिक विधि है?

NSColor * invertedColor = [someOtherColor inverted]; 

यहाँ श्रेणी विधि प्रोटोटाइप है कि मैं का उपयोग कर रहा है:

@implementation NSColor (MyCategories) 
- (NSColor *)inverted 
{ 
    NSColor * original = [self colorUsingColorSpaceName: 
         NSCalibratedRGBColorSpace]; 
    return ...? 
} 
@end 

किसी को भी रिक्त स्थान को भरने कर सकते हैं

मैं NSColor विस्तार करने के लिए इस प्रकार एक वर्ग का उपयोग किया जाएगा? यह सही नहीं होना चाहिए, लेकिन मैं इसे कुछ समझना चाहता हूं। यानी .:

  1. [[[NSColor someColor] inverted] inverted] एक रंग बहुत मूल रंग

  2. [[NSColor whiteColor] inverted] के पास में परिणाम बहुत [NSColor blackColor]

  3. उल्टे रंग के करीब color wheel के विपरीत दिशा में होगा होगी। (लाल & हरे, पीले & बैंगनी, आदि)

अल्फा मूल्य मूल NSColor के रूप में ही रहना चाहिए। मैं केवल रंग को पारदर्शीता में बदलने की तलाश में हूं।

अद्यतन 3: (! अब रंग में)

ऐसा लगता है कि एक complementary color (एक एक रंग 180 डिग्री मूल रंग से दूर के साथ रंग) का उपयोग काफी पर्याप्त नहीं है, सफेद के बाद से और काला वास्तव में एक रंग मूल्य नहीं है।

CGFloat hue = [original hueComponent]; 
if (hue >= 0.5) { hue -= 0.5; } else { hue += 0.5; } 
return [NSColor colorWithCalibratedHue:hue 
          saturation:[original saturationComponent] 
          brightness:(1.0 - [original brightnessComponent]) 
           alpha:[original alphaComponent]]; 

रंग अभी भी 180 डिग्री घुमाया जाता है, लेकिन मैं यह भी चमक घटक को उलटने के लिए इतना है कि बहुत ही गहरे रंग बहुत उज्ज्वल (और इसके विपरीत हो जाते हैं: phoebus द्वारा प्रदान की जवाब से शुरू, यह क्या मैं के साथ आया है)। यह काले और सफेद मामलों का ख्याल रखता है, लेकिन यह लगभग हर रंग को काले रंग में बदल देता है (जो मेरे डबल-इनवर्जन नियम का उल्लंघन करता है)। यहाँ परिणाम हैं:

color swatch #1 http://img29.imageshack.us/img29/8548/invert1.jpg

अब, Peter Hosey's approach बहुत सरल है, और यह बेहतर परिणाम:

return [NSColor colorWithCalibratedRed:(1.0 - [original redComponent]) 
           green:(1.0 - [original greenComponent]) 
            blue:(1.0 - [original blueComponent]) 
           alpha:[original alphaComponent]]; 

color swatch #2 http://img29.imageshack.us/img29/1513/invert2.jpg

उत्तर

21

सरल: घटक सभी 0-1 हैं, तो पूरक के मूल्य प्राप्त करने के लिए प्रत्येक घटक को 1 से घटाएं।

उदाहरण:

  • लाल = 1, 0, 0; पूरक = 0, 1, 1 = सायन
  • पीला = 1, 1, 0; पूरक = 0, 0, 1 = नीला
  • सफेद = 1, 1, 1; पूरक = 0, 0, 0 = काला
  • दीप नारंगी = 1, 0.25, 0; पूरक = 0, 0.75, 1 = आकाश नीला

जैसा कि आप अनुमान लगा सकते हैं, यह एक सममित ऑपरेशन है। उलटा उलटा करने से आपको ठीक रंग मिलेगा।

+0

इसके बारे में सीधा होने के लिए उपरोक्त :) – phoebus

+0

नोट: ग्रे = 0.5, 0.5, 0.5 के लिए; पूरक ही है। – Pang

3

आप क्या वर्णन से, ऐसा लगता है जैसे आप वास्तव में क्या लगता है चाहते हैं कि एक रंग का पूरक ढूंढने के लिए एक कार्य है, न कि इसके विपरीत। इनवर्टिंग का मतलब इस संदर्भ में कुछ अलग है।

Here's a StackOverflow question regarding complements in JavaScript। शायद कुछ कोड अनुकूलनीय है?

Here कोको रंग रिक्त स्थान में रंगों के साथ विभिन्न तरीकों के बारे में कुछ रोचक और संभावित रूप से उपयोगी जानकारी है।यह यहां जैसा दिखता है, यदि आप एचएसवी कलर स्पेस का उपयोग कर सकते हैं, तो एक रंग का पूरक केवल hue > 179 ? hue -= 180 : hue = += 180 ले कर पाया जा सकता है, क्योंकि रंगों को पूर्ण चक्र में रंगीन पहिया के चारों ओर परिभाषित किया जाता है।

+0

है। मैं इसे एक भंवर दे दूंगा। –

+0

और पूरक रंग बनाम उलटा रंगों के बारे में बिंदु के लिए धन्यवाद। मैं इसे प्रश्न में जोड़ दूंगा। –

1

यहाँ (! अल्फा वापस नहीं लिया जाता है) कस्टम सेटर के साथ कुछ oneliner है: जावा कोड होनहार लग रहा है

-(void)setReverseFontColor:(UIColor *)reverseFontColor { 
    _reverseFontColor = [AppSingleStyle reversedColorFromOriginal:reverseFontColor]; 
} 

+(UIColor*)reversedColorFromOriginal:(UIColor*)originalColor { 
    return [UIColor colorWithRed:(1-CGColorGetComponents(originalColor.CGColor)[0]) green:(1-CGColorGetComponents(originalColor.CGColor)[1]) blue:(1-CGColorGetComponents(originalColor.CGColor)[2]) alpha:CGColorGetAlpha(originalColor.CGColor)]; 
} 
+0

आप कॉन्स CGFloat * सीसी = CGColorGetComponents (originalColor.CGColor) का उपयोग करने पर विचार करना चाह सकते हैं; वापसी [यूआईसीओलर रंग विथ्रेड: (1-सीसी [0]) हरा: (1-सीसी [1]) नीला: (1-सीसी [2]) अल्फा: CGColorGetAlpha (originalcolor.CGColor)]; (एक ही परिणाम प्राप्त करने के लिए फ़ंक्शन को 3 बार क्यों कॉल करें?) – unsynchronized

संबंधित मुद्दे