سؤال

أنا أبحث عن وسيلة لعكس التعسفي nscolor القيم في وقت التشغيل ، ولا يبدو أن هناك أي طريقة مدمجة للقيام بذلك.

سأستخدم فئة لتمديدها NSColor على النحو التالي:

NSColor * invertedColor = [someOtherColor inverted];

فيما يلي نموذج الفئة الأولي الذي أستخدمه:

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

هل يمكن لأي شخص أن يملأ الفراغات؟ هذا لا يجب أن يكون مثاليًا ، لكني أود أن يكون له معنى. بمعنى آخر:

  1. [[[NSColor someColor] inverted] inverted] سوف يؤدي إلى لون قريب جدا من اللون الأصلي

  2. [[NSColor whiteColor] inverted] سيكون قريب جدا من [NSColor blackColor]

  3. ستكون الألوان المقلوبة على جانبي عجلة الألوان. (الأحمر والأخضر والأصفر والبنفسجي ، وما إلى ذلك)

يجب أن تظل قيمة ألفا هي نفسها الأصلية NSColor. أنا أتطلع فقط إلى عكس اللون, وليس الشفافية.

تحديث 3: (الآن في اللون!)

اتضح أن باستخدام أ لون مكمل (لون ذو لون 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 درجة ، لكنني أيضًا عكس مكون السطوع بحيث تصبح الألوان الداكنة جدًا مشرقة للغاية (والعكس صحيح). هذا يعتني بالحالات بالأبيض والأسود ، لكنه يزداد كل لون إلى الأسود (الذي ينتهك قاعدة الانتقاء المزدوج). ها هي النتائج:

color swatch #1

الآن، نهج بيتر هوسي هو أبسط بكثير ، وينتج نتائج أفضل:

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

color swatch #2

في سويفت 4.2:

extension NSColor {

    func inverted() -> NSColor? {
        return NSColor(calibratedRed: 1.0 - redComponent,
                               green: 1.0 - greenComponent,
                               blue: 1.0 - blueComponent,
                               alpha: alphaComponent)
    }
} 
هل كانت مفيدة؟

المحلول

بسيطة: المكونات كلها 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 = السماء الأزرق

كما يمكنك أن تخمن ، هذه عملية متماثلة. إن عكس العكسي سيحصل عليك بالضبط اللون الذي بدأت به.

نصائح أخرى

من ما تصفه ، يبدو أن ما تريده حقًا هو وظيفة للعثور على تكملة اللون ، وليس عكسها. العكس يعني شيئًا مختلفًا في هذا السياق.

إليك سؤال Stackoverflow فيما يتعلق بالمكملات في JavaScript. ربما بعض الكود قابل للتكيف؟

هنا هل بعض المعلومات المثيرة للاهتمام والمفيدة حول الطرق المختلفة يمكن العمل معها في مساحات ألوان الكاكاو. من ما يبدو هنا ، إذا كان يمكنك استخدام مساحة ألوان HSV ، فيمكن العثور على تكملة اللون بمجرد أخذها ببساطة hue > 179 ? hue -= 180 : hue = += 180, ، حيث يتم تعريف الأشكال حول عجلة الألوان في دائرة كاملة.

فيما يلي بعض oneliner مع setter مخصصة (لا يتم عكس ألفا!):

-(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)];
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top