ইউআইকোলার অন্ধকার বা উজ্জ্বল কিনা তা পরীক্ষা করে দেখুন?


107

আমাকে নির্বাচিত ইউআইসিওলর (ব্যবহারকারী চয়ন করেছেন) অন্ধকার বা উজ্জ্বল কিনা তা নির্ধারণ করতে হবে, তাই আরও ভাল পাঠযোগ্যতার জন্য আমি সেই রঙের শীর্ষে থাকা পাঠ্যের একটি রেখার রঙ পরিবর্তন করতে পারি।

ফ্ল্যাশ / অ্যাকশনস্ক্রিপ্টের একটি উদাহরণ এখানে (ডেমো সহ): http://web.archive.org/web/20100102024448/http://theflashblog.com/?p=173

কোন চিন্তা?

চিয়ার্স, আন্দ্রে

হালনাগাদ

প্রত্যেকের পরামর্শের জন্য ধন্যবাদ, এখানে কার্য কোড:

- (void) updateColor:(UIColor *) newColor
{
    const CGFloat *componentColors = CGColorGetComponents(newColor.CGColor);

    CGFloat colorBrightness = ((componentColors[0] * 299) + (componentColors[1] * 587) + (componentColors[2] * 114)) / 1000;
    if (colorBrightness < 0.5)
    {
        NSLog(@"my color is dark");
    }
    else
    {
        NSLog(@"my color is light");
    }
}

আবারও একবার ধন্যবাদ :)


দেখে মনে হচ্ছে যে কয়েকটি রঙের 3 টি উপাদান নেই, যেমন ইউআইক্লোর.ব্ল্যাক।
গ্লেন হাউস

উত্তর:


75

ডাব্লু 3 সিতে নিম্নলিখিতগুলি রয়েছে: http://www.w3.org/WAI/ER/WD-AERT/#color-contrast

যদি আপনি কেবল কালো বা সাদা পাঠ্য করেন তবে উপরের বর্ণের উজ্জ্বলতা গণনাটি ব্যবহার করুন। যদি এটি 125 এর নিচে থাকে তবে সাদা পাঠ্য ব্যবহার করুন। এটি যদি 125 বা তার বেশি হয় তবে কালো লেখাটি ব্যবহার করুন।

সম্পাদনা 1: কালো পাঠ্যের দিকে পক্ষপাত। :)

সম্পাদনা 2: ব্যবহারের সূত্রটি হ'ল ((লাল মান * 299) + (সবুজ মান * 587) + (নীল মান * 114)) / 1000


আপনি কি জানেন যে কীভাবে কোনও রঙের লাল, সবুজ এবং নীল মান পাবেন?
আন্দ্রে

আপনি NSArray *components = (NSArray *)CGColorGetComponents([UIColor CGColor]);আলফা সহ রঙের উপাদানগুলির একটি অ্যারে পেতে ব্যবহার করতে পারেন । দস্তাবেজগুলি সেগুলি যে ক্রমে রয়েছে তা নির্দিষ্ট করে না তবে আমি ধারনা করি এটি লাল, সবুজ, নীল, আলফা হবে। এছাড়াও, দস্তাবেজগুলি থেকে, "অ্যারের আকার রঙের জন্য রঙের স্থানের সংখ্যার চেয়ে আরও একটি বেশি" " - এটি কেন বলে না ...
জাসারিইন

এটি বিজোড় ... ব্যবহার করে: এনএসআরএ * উপাদানগুলি = (এনএসআরএ *) সিজি কালারগেটক্যাম্পোন্টস (নতুন কালার.সিজি কলার); এনএসএলগ (@ "আমার রঙের উপাদানগুলি% f% f% f% f", উপাদানগুলি [0], উপাদানগুলি [1], উপাদানগুলি [2], উপাদানগুলি [3]); আমি মানগুলি পেতে পারি কিনা তা দেখতে কেবলমাত্র 0 টি সূচী পরিবর্তনগুলি মনে হয়, অন্যরাও একই থাকবে, আমি যে রঙটিই বাছাই করি না কেন। কোন ধারণা কেন?
আন্দ্রে

বুঝেছি. আপনি এনএসআরাই ব্যবহার করতে পারবেন না। পরিবর্তে এটি ব্যবহার করুন: কনস্টিগ্রেজ সিজিএফ্লোট * উপাদানগুলি = সিজি কালারগেটকম্পোন্টস (নতুন কালার.সিজি কলর); এছাড়াও, ক্রমটি হল: লাল হল উপাদানগুলি [0]; সবুজ উপাদান [1]; নীল উপাদানগুলি [2]; আলফা উপাদানগুলি [3];
আন্দ্রে

আহ, আমার খারাপ। আমি ভেবেছিলাম এটি কোনও সি অ্যারে নয়, একটি সিএফআররেফ ফিরিয়ে দিয়েছে। দুঃখিত!
জাসারিন

44

এই চেকটি সম্পাদন করতে এখানে একটি সুইফ্ট (3) এক্সটেনশান রয়েছে।

এই এক্সটেনশনটি গ্রেস্কেল রঙের সাথে কাজ করে। তবে, আপনি যদি আরজিবি ইনিশিয়ালাইজারের সাহায্যে আপনার সমস্ত রঙ তৈরি করছেন এবং অন্তর্নির্মিত রঙ যেমন UIColor.blackএবং ব্যবহার না করছেন UIColor.white, তবে সম্ভবত আপনি অতিরিক্ত চেকগুলি সরাতে পারেন।

extension UIColor {

    // Check if the color is light or dark, as defined by the injected lightness threshold.
    // Some people report that 0.7 is best. I suggest to find out for yourself.
    // A nil value is returned if the lightness couldn't be determined.
    func isLight(threshold: Float = 0.5) -> Bool? {
        let originalCGColor = self.cgColor

        // Now we need to convert it to the RGB colorspace. UIColor.white / UIColor.black are greyscale and not RGB.
        // If you don't do this then you will crash when accessing components index 2 below when evaluating greyscale colors.
        let RGBCGColor = originalCGColor.converted(to: CGColorSpaceCreateDeviceRGB(), intent: .defaultIntent, options: nil)
        guard let components = RGBCGColor?.components else {
            return nil
        }
        guard components.count >= 3 else {
            return nil
        }

        let brightness = Float(((components[0] * 299) + (components[1] * 587) + (components[2] * 114)) / 1000)
        return (brightness > threshold)
    }
}

পরীক্ষা:

func testItWorks() {
    XCTAssertTrue(UIColor.yellow.isLight()!, "Yellow is LIGHT")
    XCTAssertFalse(UIColor.black.isLight()!, "Black is DARK")
    XCTAssertTrue(UIColor.white.isLight()!, "White is LIGHT")
    XCTAssertFalse(UIColor.red.isLight()!, "Red is DARK")
}

দ্রষ্টব্য: সুইফ্ট 3 12/7/18 এ আপডেট হয়েছে


6
দুর্দান্ত কাজ করে। সুইফট ২.০ সহ - আমি উজ্জ্বলতার গণনার জন্য একটি সংকলক ত্রুটি পেয়েছি: "যুক্তিযুক্ত সময়ে যুক্তিটি সমাধান করা খুব জটিল ছিল; এক্সপ্রেশনটি পৃথক উপ-এক্সপ্রেশনগুলিতে ভাঙ্গা বিবেচনা করুন"। আমি এটিকে টাইপ করে এটি সংশোধন করেছি: "উজ্জ্বলতা = ((উপাদানগুলি [0] * 299.0) সিজিফ্লোট হিসাবে) + ((উপাদানগুলি [1] * 587.0) সিজিফ্লোয়েট হিসাবে) + ((উপাদানগুলি [2] * 114.0)) সিজিফ্লোয়েট হিসাবে ) / (1000 সিজিফ্লোয়েট হিসাবে) "
100

1
আমার সুইফট ২.১-এর একই সমস্যা ছিল। আমি উপাদানগুলির সাথে অ্যাক্সেস না করে কেবল ভেরিয়েবল তৈরি করে এই সমস্যাটি সমাধান করেছি components[0]। ভালো লেগেছে:let componentColorX: CGFloat = components[1]
পেট্রিটজ

1
এক্সকোড আমাকে উজ্জ্বলতা বলে = "যুক্তিযুক্ত
যুক্তিতে

দাইদাই, শুধু অভিব্যক্তি সহজ করুন। শেষে বিভাগটি অপ্রয়োজনীয়। আমাদের 0 - 1 সীমাতে কাজ করার দরকার নেই 1000 দ্বারা ভাগ করবেন না, তবে কেবল পরিবর্তে মান 500 এর চেয়ে বেশি কিনা তা পরীক্ষা করে দেখুন।
30:48

32

এরিক নেডওয়াইডেকের উত্তরটি ব্যবহার করে, আমি সহজেই অন্তর্ভুক্তির জন্য কোডটির সেই ছোট্ট স্নিপেট নিয়ে এসেছি।

- (UIColor *)readableForegroundColorForBackgroundColor:(UIColor*)backgroundColor {
    size_t count = CGColorGetNumberOfComponents(backgroundColor.CGColor);
    const CGFloat *componentColors = CGColorGetComponents(backgroundColor.CGColor);

    CGFloat darknessScore = 0;
    if (count == 2) {
        darknessScore = (((componentColors[0]*255) * 299) + ((componentColors[0]*255) * 587) + ((componentColors[0]*255) * 114)) / 1000;
    } else if (count == 4) {
        darknessScore = (((componentColors[0]*255) * 299) + ((componentColors[1]*255) * 587) + ((componentColors[2]*255) * 114)) / 1000;
    }

    if (darknessScore >= 125) {
        return [UIColor blackColor];
    }

    return [UIColor whiteColor];
}

আমি এই কোডটি ব্যবহার করেছি, নিখুঁতভাবে কাজ করেছি, তবে কখনই আমি [ইউআইকলার ব্ল্যাক কালার] সেট করি না জানি না, এটি অন্ধকার স্কোর = 149.685 প্রদান করবে। কেন আপনি এটি ব্যাখ্যা করতে পারেন?
DivineDesert

3
এই কোডটি আরবিজিবিহীন রঙের মতো কাজ করবে না UIColor whiteColor, grayColor, blackColor
rmaddy

@ আরমড্ডি কেন? বা হোয়াইট কালার, গ্রে কালার এবং ব্ল্যাক কালার আরজিবি রঙ কেন নয়?
mattsven

1
@ আরমডি আমি আরজিবি রঙের স্থান বনাম গ্রেস্কেল-এর রঙের মধ্যে পার্থক্য কীভাবে প্রোগ্রামিয়ালি বলতে পারি?
ম্যাটসভেন

1
@ এমডি কিছু নয়! সাহায্যের জন্য ধন্যবাদ - stackoverflow.com/questions/1099569/...
mattsven

31

Swift3

extension UIColor {
    var isLight: Bool {
        var white: CGFloat = 0
        getWhite(&white, alpha: nil)
        return white > 0.5
    }
}

// Usage
if color.isLight {
    label.textColor = UIColor.black
} else {
    label.textColor = UIColor.white
}

আমার জন্য এটি সেরা। এমনকি আপনার প্রয়োজন অনুসারে আপনি চেকের মধ্যে সাদা পরিসীমা নির্ধারণ করতে পারেন এবং এটি অতি সাধারণ এবং দেশীয়। ধন্যবাদ।
Andreas777

9

সুইফট 4 সংস্করণ

extension UIColor {
    func isLight() -> Bool {
        guard let components = cgColor.components, components.count > 2 else {return false}
        let brightness = ((components[0] * 299) + (components[1] * 587) + (components[2] * 114)) / 1000
        return (brightness > 0.5)
    }
}

1
এটি সম্ভবত ইউআইক্লোর.হাইটের মতো ডিফল্ট সিস্টেমের রঙগুলির জন্য কাজ করবে না কারণ এটির কেবল দুটি উপাদান থাকবে, এটি আরজিবি প্রতিনিধিত্ব নয়।
স্ক্রু

7

একটি বিভাগে এই সমস্যার সমাধান (এখানে অন্যান্য উত্তর থেকে আঁকা)। গ্রেস্কেল রঙগুলির সাথেও কাজ করে, যা লেখার সময় অন্যান্য উত্তরগুলির কোনওটিই করে না।

@interface UIColor (Ext)

    - (BOOL) colorIsLight;

@end

@implementation UIColor (Ext)

    - (BOOL) colorIsLight {
        CGFloat colorBrightness = 0;

        CGColorSpaceRef colorSpace = CGColorGetColorSpace(self.CGColor);
        CGColorSpaceModel colorSpaceModel = CGColorSpaceGetModel(colorSpace);

        if(colorSpaceModel == kCGColorSpaceModelRGB){
            const CGFloat *componentColors = CGColorGetComponents(self.CGColor);

            colorBrightness = ((componentColors[0] * 299) + (componentColors[1] * 587) + (componentColors[2] * 114)) / 1000;
        } else {
            [self getWhite:&colorBrightness alpha:0];
        }

        return (colorBrightness >= .5f);
    }

@end

আরজিবিবিহীন রঙগুলির দুর্দান্ত হ্যান্ডলিং - কবজির মতো কাজ করে।
হাটুনিকে

5

সরল সুইফ্ট 3 এক্সটেনশন:

extension UIColor {
    func isLight() -> Bool {
        guard let components = cgColor.components else { return false }
        let redBrightness = components[0] * 299
        let greenBrightness = components[1] * 587
        let blueBrightness = components[2] * 114
        let brightness = (redBrightness + greenBrightness + blueBrightness) / 1000
        return brightness > 0.5
    }
}

2
এটি সম্ভবত ইউআইক্লোর.হাইটের মতো ডিফল্ট সিস্টেমের রঙগুলির জন্য কাজ করবে না কারণ এটির কেবল দুটি উপাদান থাকবে, এটি আরজিবি প্রতিনিধিত্ব নয়।
স্ক্রু

সত্য! আপনি রঙটি হেক্স-স্ট্রিংয়ে রূপান্তর করতে পারেন এবং তারপরে ইউআইক্লোরারে ফিরে যেতে পারেন account
সুনকাস

3

আপনি যদি ব্লক সংস্করণটি পছন্দ করেন:

BOOL (^isDark)(UIColor *) = ^(UIColor *color){
    const CGFloat *component = CGColorGetComponents(color.CGColor);
    CGFloat brightness = ((component[0] * 299) + (component[1] * 587) + (component[2] * 114)) / 1000;

    if (brightness < 0.75)
        return  YES;
    return NO;
};

2

ধূসর বর্ণের নয় এমন সমস্ত কিছুর জন্য, কোনও রঙের আরজিবি বিপরীতটি সাধারণত এটির সাথে খুব বেশি বিপরীত হয়। ডেমোটি কেবল রঙটি উল্টে দেয় এবং এটিকে বিস্মৃত করে (এটিকে ধূসর করে তোলে)।

তবে রঙের একটি সুন্দর সুদৃশ্য সংমিশ্রণ করা বেশ জটিল। তাকানো :

http://particletree.com/notebook/calculating-color-contrast-for-legible-text/


1
যদি কেবলমাত্র এর আইফোন সংস্করণ থাকে: ডি
আন্দ্রে

সুতরাং যদি আমি কোনও রঙের আরজিবি মানগুলি পাই (যা আমি কীভাবে করব তা আমি জানি না) এবং সেই মানগুলির বিপরীতটি দিয়ে একটি নতুন রঙ তৈরি করেছি, তবে এটি খুব বেসিক স্তরে কাজ করা উচিত?
আন্দ্রে

2

নিম্নলিখিত পদ্ধতিটি হ'ল সাদা রঙের উপর ভিত্তি করে সুইফট ভাষায় রঙ হালকা বা গা dark় find

func isLightColor(color: UIColor) -> Bool 
{
   var white: CGFloat = 0.0
   color.getWhite(&white, alpha: nil)

   var isLight = false

   if white >= 0.5
   {
       isLight = true
       NSLog("color is light: %f", white)
   }
   else
   {
      NSLog("Color is dark: %f", white)
   }

   return isLight
}

নিম্নলিখিত উপাদানটি হ'ল রঙের উপাদানগুলি ব্যবহার করে রঙটি হালকা বা গা .় রঙের রঙের স্যুইফ্টে খুঁজে পাওয়া যাবে।

func isLightColor(color: UIColor) -> Bool 
{
     var isLight = false

     var componentColors = CGColorGetComponents(color.CGColor)

     var colorBrightness: CGFloat = ((componentColors[0] * 299) + (componentColors[1] * 587) + (componentColors[2] * 114)) / 1000;
     if (colorBrightness >= 0.5)
     {
        isLight = true
        NSLog("my color is light")
     }
     else
     {
        NSLog("my color is dark")
     }  
     return isLight
}

2

আমার জন্য কেবল সিজি কালারগেটক্যাম্পোন্টগুলি ব্যবহার করে কাজ হয়নি, আমি ইউআইকিলোরের জন্য সাদা হিসাবে 2 টি উপাদান পাই। তাই আমাকে প্রথমে রঙ স্পেসমোডেলটি পরীক্ষা করতে হবে। এটিই আমি এসেছি যা শেষ হয়েছে @ ম্যাটসভেনের উত্তরের দ্রুততম সংস্করণ।

রঙ স্থানটি এখান থেকে নেওয়া হয়েছে: https://stackoverflow.com/a/16981916/4905076

extension UIColor {
    func isLight() -> Bool {
        if let colorSpace = self.cgColor.colorSpace {
            if colorSpace.model == .rgb {
                guard let components = cgColor.components, components.count > 2 else {return false}

                let brightness = ((components[0] * 299) + (components[1] * 587) + (components[2] * 114)) / 1000

                return (brightness > 0.5)
            }
            else {
                var white : CGFloat = 0.0

                self.getWhite(&white, alpha: nil)

                return white >= 0.5
            }
        }

        return false
    }

2

ইউআইসিওলারের এইচএসবি রঙের স্পেসে রূপান্তর করতে নিম্নলিখিত পদ্ধতি রয়েছে :

- (BOOL)getHue:(CGFloat *)hue saturation:(CGFloat *)saturation brightness:(CGFloat *)brightness alpha:(CGFloat *)alpha;

1
- (BOOL)isColorLight:(UIColor*)color
{
    CGFloat white = 0;
    [color getWhite:&white alpha:nil];
    return (white >= .85);
}

সংযুক্ত Swift 5সংস্করণ:

var white: CGFloat = 0.0
color.getWhite(&white, alpha: nil)
return white >= .85 // Don't use white background

1
এটি কেবলমাত্র তখনই কাজ করে যদি UIColorগ্রেস্কেল রঙ হয়। একটি এলোমেলো আরজিবি রঙ এই কোডটি দিয়ে কাজ করবে না।
rmaddy

0

আপনি যদি রঙটির উজ্জ্বলতা খুঁজে পেতে চান তবে এখানে কয়েকটি সিডো কোড রয়েছে:

public float GetBrightness(int red, int blue, int green)
{
    float num = red / 255f;
    float num2 = blue / 255f;
    float num3 = green / 255f;
    float num4 = num;
    float num5 = num;
    if (num2 > num4)
        num4 = num2;
    if (num3 > num4)
        num4 = num3;
    if (num2 < num5)
        num5 = num2;
    if (num3 < num5)
        num5 = num3;
    return ((num4 + num5) / 2f);
}

যদি এটি 0.5 হয় তবে এটি উজ্জ্বল এবং অন্যথায় অন্ধকার।


2
আপনি প্রতিটি রঙের সমানভাবে ওজন করতে পারবেন না। আমাদের চোখের নীলের বিরুদ্ধে পক্ষপাত রয়েছে এবং কিছুটা কম পরিমাণে লাল।
এরিক নেডওয়াইডক

@ এরিকনেডওয়াইডেক: যথেষ্ট ন্যায্য, প্রশ্নটি কেবল রঙের উজ্জ্বলতার জন্য জিজ্ঞাসা করেছিল :)
ব্রায়ান ড্যানি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.