Як порівняти UIColors?


127

Я хотів би перевірити набір кольорів для фону на UIImageView. Я спробував:

if(myimage.backgroundColor == [UIColor greenColor]){
...}
else{
...}

але це не працює, навіть коли я знаю, що колір зелений, він завжди потрапляє в іншу частину.

Також, чи є спосіб вивести поточний колір у консолі налагодження.

p [myimage backgroundColor]

і

po [myimage backgroundColor]

не працюють.

Відповіді:


176

Ви пробували [myColor isEqual:someOtherColor]?


Дякую. Яка різниця з isEqualTo? Також, чи знаєте ви, як відобразити це у налагоджувачі?
4thSpace

93
До речі: будьте обережні, порівнюючи кольори таким чином, адже вони повинні бути в одній кольоровій моделі, щоб вважати рівними. Наприклад, # ffffffне дорівнює [UIColor whiteColor].
Зуль

2
Хороший момент Зул, може бути корисніше вказати на рішення не просто проблеми, хоча = D
pfrank

11
Хороша точка Пфранка, може бути корисніше вказати на рішення не тільки проблеми, хоча = D
Альберт Реншо

Не завжди працював для мене при порівнянні кнопки.tintColor з кольором, який я встановив. Мав відношення до округлення. Якщо ви стикаєтесь з цим, дивіться мою відповідь нижче.
Пбк

75

Як в коментарях зазначав Зул, isEqual:повернеться NOпри порівнянні кольорів, що знаходяться в різних моделях / просторах (наприклад, #FFFз [UIColor whiteColor]). Я написав це розширення UIColor, яке перетворює обидва кольори в один і той же кольоровий простір, перш ніж порівнювати їх:

- (BOOL)isEqualToColor:(UIColor *)otherColor {
    CGColorSpaceRef colorSpaceRGB = CGColorSpaceCreateDeviceRGB();

    UIColor *(^convertColorToRGBSpace)(UIColor*) = ^(UIColor *color) {
        if (CGColorSpaceGetModel(CGColorGetColorSpace(color.CGColor)) == kCGColorSpaceModelMonochrome) {
            const CGFloat *oldComponents = CGColorGetComponents(color.CGColor);
            CGFloat components[4] = {oldComponents[0], oldComponents[0], oldComponents[0], oldComponents[1]};
            CGColorRef colorRef = CGColorCreate( colorSpaceRGB, components );

            UIColor *color = [UIColor colorWithCGColor:colorRef];
            CGColorRelease(colorRef);
            return color;            
        } else
            return color;
    };

    UIColor *selfColor = convertColorToRGBSpace(self);
    otherColor = convertColorToRGBSpace(otherColor);
    CGColorSpaceRelease(colorSpaceRGB);

    return [selfColor isEqual:otherColor];
}

2
Добре, але є витік, я думаю. Ви ніколи не випускаєте CGColorCreate в середині.
borrrden

Це ідеальне рішення!
алонес

Чи можете ви пояснити, що відбувається з каратами? Я не думаю, що раніше бачив цей синтаксис.
Віктор Енгель

@VictorEngel, UIColor *(^convertColorToRGBSpace)(UIColor*) = ^(UIColor *color) ...оголошує а block. Пізніше він використовує його convertColorToRGBSpace(self). Про вступ до блоків в iOS дивіться у raywenderlich.com/9328/creating-a-diner-app-using-blocks-part-1
JRG-Developer

1
Я використовую всі зубці, але ніколи раніше не бачив синтаксису. Я думаю, можливо, я не використав блок, який повертав об'єкт. Це те, що ліворуч від =, що я публікував.
Віктор Енгель

65

Це може бути трохи пізно, але CoreGraphics має простіший API для досягнення цього:

CGColorEqualToColor(myColor.CGColor, [UIColor clearColor].CGColor)

Як написано в документації:

Позначає, чи однакові два кольори. Два кольори рівні, якщо вони мають рівні кольорові простори та чисельно рівні кольорові компоненти.

Це вирішує багато проблем та алгоритми витоку / користувацькі.


5
[UIColor isEqual:]робить те саме, що і це, чи не так? Відповідь Марка все ще є єдиною, яка перевіряє еквівалентність, незважаючи на гарний простір кольорів.
матцвен

9
Це не допомагає більше, ніж UIColor isEqual:якщо кольори в різних кольорових просторах.
Ешелон

Питання стосується порівняння UIColor, а не порівняння CGColor.
Шон Вікорен

Точніше за всі інші рішення :) +1 від мене
Нірав Гадхія

8

Рішення samvermette перекладено на swift:

extension UIColor {
    func isEqualToColor(otherColor : UIColor) -> Bool {
        if self == otherColor {
            return true
        }

        let colorSpaceRGB = CGColorSpaceCreateDeviceRGB()
        let convertColorToRGBSpace : ((color : UIColor) -> UIColor?) = { (color) -> UIColor? in
            if CGColorSpaceGetModel(CGColorGetColorSpace(color.CGColor)) == CGColorSpaceModel.Monochrome {
                let oldComponents = CGColorGetComponents(color.CGColor)
                let components : [CGFloat] = [ oldComponents[0], oldComponents[0], oldComponents[0], oldComponents[1] ]
                let colorRef = CGColorCreate(colorSpaceRGB, components)
                let colorOut = UIColor(CGColor: colorRef!)
                return colorOut
            }
            else {
                return color;
            }
        }

        let selfColor = convertColorToRGBSpace(color: self)
        let otherColor = convertColorToRGBSpace(color: otherColor)

        if let selfColor = selfColor, otherColor = otherColor {
            return selfColor.isEqual(otherColor)
        }
        else {
            return false
        }
    }
}

7
#import "UIColor-Expanded.h"
//https://github.com/thetaplab/uicolor-utilities

//RGB distance
CGFloat distance = sqrtf(powf((clr0.red - clr1.red), 2) + powf((clr0.green - clr1.green), 2) + powf((clr0.blue - clr1.blue), 2) );
if(distance<=minDistance){
....
}else{
...
}

@Рудольф Адамкович, це теорема Піфагора
Віктор Гольтвяниця

6

Це розширення UIColor працює чудово за умови, що порівняні кольори можуть бути перетворені у формат RGB, що має бути в більшості випадків.

public extension UIColor {

    static func == (l: UIColor, r: UIColor) -> Bool {
        var l_red = CGFloat(0); var l_green = CGFloat(0); var l_blue = CGFloat(0); var l_alpha = CGFloat(0)
        guard l.getRed(&l_red, green: &l_green, blue: &l_blue, alpha: &l_alpha) else { return false }
        var r_red = CGFloat(0); var r_green = CGFloat(0); var r_blue = CGFloat(0); var r_alpha = CGFloat(0)
        guard r.getRed(&r_red, green: &r_green, blue: &r_blue, alpha: &r_alpha) else { return false }
        return l_red == r_red && l_green == r_green && l_blue == r_blue && l_alpha == r_alpha
    }
}

Принаймні з цим розширенням:

UIColor.whiteColor == UIColor(hex: "#FFFFFF") // true
UIColor.black == UIColor(red: 0, green: 0, blue: 0, alpha: 1) // true

Обидва порівняння повертаються помилковими, якщо порівнювати з використанням рідного UColor.isEqual (...)


5

Я написав цю категорію. Якщо isEqual:повернеться "НІ", він перевірить, чи може подальше порівняння різних компонентів ще збігатися. Якщо можливо, все-таки порівнюються різні моделі.

@implementation UIColor (Matching)


-(BOOL)matchesColor:(UIColor *)color error:(NSError *__autoreleasing *)error
{
    UIColor *lhs = self;
    UIColor *rhs = color;

    if([lhs isEqual:rhs]){ // color model and values are the same
        return YES;
    }

    CGFloat red1, red2, green1, alpha1, green2, blue1, blue2, alpha2;
    BOOL lhsSuccess = [lhs getRed:&red1 green:&green1 blue:&blue1 alpha:&alpha1];
    BOOL rhsSuccess = [rhs getRed:&red2 green:&green2 blue:&blue2 alpha:&alpha2];
    if((!lhsSuccess && rhsSuccess) || (lhsSuccess && !rhsSuccess)){ // one is RGBA, one color not.
        CGFloat r,g,b,a;
        if(!lhsSuccess){ // lhs color could be a monochrome
            const CGFloat *components = CGColorGetComponents(lhs.CGColor);
            if([lhs _colorSpaceModel] == kCGColorSpaceModelMonochrome){
                r = g = b = components[0];
                a = components[1];

                return r == red2 && g == green2 && b == blue2 && a == alpha2;
            }
        } else {  // rhs color could be a monochrome
            const CGFloat *components = CGColorGetComponents(rhs.CGColor);

            if([rhs _colorSpaceModel] == kCGColorSpaceModelMonochrome){
                r = g = b = components[0];
                a = components[1];
                return r == red1 && g == green1 && b == blue1 && a == alpha1;
            }
        }


        NSError *aError = [[NSError alloc] initWithDomain:@"UIColorComparision" code:-11111 userInfo:[self _colorComparisionErrorUserInfo]];
        *error = aError;
        return  NO;
    } else if (!lhsSuccess && !rhsSuccess){ // both not RGBA, lets try HSBA
        CGFloat hue1,saturation1,brightness1;
        CGFloat hue2,saturation2,brightness2;

        lhsSuccess = [lhs getHue:&hue1 saturation:&saturation1 brightness:&brightness1 alpha:&alpha1];
        rhsSuccess = [lhs getHue:&hue2 saturation:&saturation2 brightness:&brightness2 alpha:&alpha2];
        if((!lhsSuccess && rhsSuccess) || (lhsSuccess && !rhsSuccess)){
            NSError *aError = [[NSError alloc] initWithDomain:@"UIColorComparision" code:-11111 userInfo:[self _colorComparisionErrorUserInfo]];
            *error = aError;
            return  NO;
        } else if(!lhsSuccess && !rhsSuccess){ // both not HSBA, lets try monochrome
            CGFloat white1, white2;

            lhsSuccess = [lhs getWhite:&white1 alpha:&alpha1];
            rhsSuccess = [rhs getWhite:&white2 alpha:&alpha2];
            if((!lhsSuccess && rhsSuccess) || (lhsSuccess && !rhsSuccess)){
                NSError *aError = [[NSError alloc] initWithDomain:@"UIColorComparision" code:-11111 userInfo:[self _colorComparisionErrorUserInfo]];
                *error = aError;
                return  NO;
            } else {
                return white1 == white2 && alpha1 == alpha2;
            }

        } else {
            return hue1 == hue2 && saturation1 == saturation2 && brightness1 == brightness2 && alpha1 == alpha2;
        }

    } else {
        return (red1 == red2 && green1 == green2 && blue1 == blue2 && alpha1 == alpha2);

    }
}

-(NSDictionary *)_colorComparisionErrorUserInfo{

    NSDictionary *userInfo = @{
                               NSLocalizedDescriptionKey: NSLocalizedString(@"Comparision failed.", nil),
                               NSLocalizedFailureReasonErrorKey: NSLocalizedString(@"The colors models are incompatible. Or the color is a pattern.", nil),

                               };
    return userInfo;
}

- (CGColorSpaceModel)_colorSpaceModel {
    return CGColorSpaceGetModel(CGColorGetColorSpace(self.CGColor));
}

@end

UIColor *green1 = [UIColor greenColor];
UIColor *green2 = [UIColor colorWithRed:0 green:1 blue:0 alpha:1];
UIColor *yellow = [UIColor yellowColor];
UIColor *grey1  = [UIColor colorWithWhite:2.0/3.0 alpha:1];
UIColor *grey2  = [UIColor lightGrayColor];

NSError *error1, *error2, *error3, *error4, *error5;

BOOL match1 = [green1 matchesColor:green2 error:&error1];   // YES
BOOL match2 = [green1 matchesColor:yellow error:&error2];   // NO
BOOL match3 = [green1 matchesColor:grey1 error:&error3];    // NO
BOOL match4 = [grey1 matchesColor:grey2 error:&error4];     // YES
BOOL match5 = [grey1 matchesColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"bg.png"]]
                            error:&error5];                 // NO, Error

2

Якщо ви порівнюєте myimage.backgroundColor == [UIColor greenColor]це так, якщо вам не потрібно змінити backgroundColor на зелений перед цим твердженням, він не працює.

У мене була така ж проблема в моїй кольоровій грі, і я вирішив, що, використовуючи просте рівняння різниці в кольорах RGB, ви можете швидко переглянути цей короткий зразок коду ColorProcess звідси

це як відповідь переможців

GFloat distance = sqrtf(powf((clr0.red - clr1.red), 2) + powf((clr0.green - clr1.green), 2) + powf((clr0.blue - clr1.blue), 2) );
if(distance<=minDistance){
....
}else{

}

Замість цього зразка коду ви можете використовувати

include "UIColorProcess.h"

..

float distance = [UIColorProcess findDistanceBetweenTwoColor:[UIColor redColor] secondColor:[UIColor blueColor]];

і звичайно, якщо він повертає 0, це означає, що ви порівнюєте занадто подібний колір. Діапазон повернення - щось на зразок (0,0f - 1,5f).


color.red/blue/green не підтримується для всіх типів кольорових класів, перевірте документи
pfrank

1

Можуть виникати деякі дивні помилки округлення. Це може бути причиною того, що об'єкт встановив колір і колір, який ви встановили, не точно відповідати.

Ось як я це вирішив:

private func compareColors (c1:UIColor, c2:UIColor) -> Bool{
    // some kind of weird rounding made the colors unequal so had to compare like this

    var red:CGFloat = 0
    var green:CGFloat  = 0
    var blue:CGFloat = 0
    var alpha:CGFloat  = 0
    c1.getRed(&red, green: &green, blue: &blue, alpha: &alpha)

    var red2:CGFloat = 0
    var green2:CGFloat  = 0
    var blue2:CGFloat = 0
    var alpha2:CGFloat  = 0
    c2.getRed(&red2, green: &green2, blue: &blue2, alpha: &alpha2)

    return (Int(green*255) == Int(green2*255))

}

Цей код можна вдосконалити, не тільки порівнявши 1, але порівнявши всі компоненти. Наприклад, червоний + зелений + синій + альфа == червоний2 + зелений2 + синій2 + альфа2


1
Кольори не однакові, якщо порівнювати лише зелений компонент
Бен Сінклер

Це єдина відповідь, що згадує та намагається вирішити потенційні помилки округлення, які можуть з’являтися під час порівняння кольорів, встановлених різними способами; тож, хоча він зосереджений лише на зеленому, приклад (як згадує автор відповіді) можна узагальнити. Тому, оскільки округлення насправді було проблемою, з якою я стикався, я вважав цю відповідь корисною.
Метт Вагнер

1

Я використовую це розширення, яке працює для мене у всіх випадках.

/***** UIColor Extension to Compare colors as string *****/
@interface UIColor (compare)
- (BOOL)compareWithColor:(UIColor *)color;
@end

@implementation UIColor(compare)
- (BOOL)compareWithColor:(UIColor *)color {
    return ([[[CIColor colorWithCGColor:self.CGColor] stringRepresentation] isEqualToString:[[CIColor colorWithCGColor:color.CGColor] stringRepresentation]]);
}
@end
/**** End ****/

Надія допомагає комусь.

Примітка: #ffffffробить рівним [UIColor whiteColor]цим розширенням


Це працює, порівнюючи кольори в кольорових просторах?
Ваддаді Картік

Не впевнений, я не перевіряв його на всіх кольорових просторах.
arunit21

1

Інші рішення працювали неправильно. Ось підхід, який працює у Swift:

import CoreGraphics

extension UIColor {

    /**
     Checks for visual equality of two colors regardless of their color space.
     - parameter    color:  The other color for comparison.
     - returns:     A boolean representing whether the colors are visually the same color.
     */
    public func isVisuallyEqualTo(_ color: UIColor) -> Bool {
        return rgbaComponents == color.rgbaComponents
    }

    public var rgbaComponents: [CGFloat] {
        var data = [CUnsignedChar](repeating: 0, count: 4)
        let colorSpace = CGColorSpaceCreateDeviceRGB()
        let context = CGContext(data: &data,
                                width: 1, height: 1,
                                bitsPerComponent: 8, bytesPerRow: 4,
                                space: colorSpace,
                                bitmapInfo: CGImageAlphaInfo.noneSkipLast.rawValue)
        context?.setFillColor(cgColor)
        context?.fill(CGRect(x: 0, y: 0, width: 1, height: 1))
        return data.map { CGFloat($0) / 255.0 }
    }

}

0

А як на рахунок:

+(BOOL)color:(UIColor *)color1 matchesColor:(UIColor *)color2
{
    CGFloat red1, red2, green1, green2, blue1, blue2, alpha1, alpha2;
    [color1 getRed:&red1 green:&green1 blue:&blue1 alpha:&alpha1];
    [color2 getRed:&red2 green:&green2 blue:&blue2 alpha:&alpha2];

    return (red1 == red2 && green1 == green2 && blue1 == blue2 && alpha1 == alpha2);
}

це може не працювати для крайових випадків як колір візерунка. від doc Якщо колір знаходиться у сумісному кольоровому просторі, колір перетворюється у формат RGB і його компоненти повертаються у вашу програму. Якщо колір не знаходиться в сумісному кольоровому просторі, параметри не змінюються. Таким чином, ви можете створити екземпляр кожного плаваючого коду, -1і якщо якийсь все ще має це значення після виклику getRed:green:blue:alpha:, ви знаєте, що порівняння не вдалося. (або не опускайте повернутого булевого
сигналу,

1
Я щойно перевірив: хоча теоретично можна перевірити монохромність у кольорах RGBA, він не працюватиме з вашим кодом, оскільки getRed:free:blue:alpha:не вдасться досягти однотонного кольору. Тож ваш код не дасть іншого результату, ніж is equal:. будь ласка, дивіться мою відповідь, як з цим боротися.
vikingosegundo

+1 за ретельність! Наведений вище код працює для мого простого випадку, але, здається, це не срібна куля. Хороший матеріал.
Дулейо

0

Ось розширення для переходу на RGC Space Color у Swift:

extension UIColor {

func convertColorToRGBSpaceColor() -> UIColor {
    let colorSpaceRGB = CGColorSpaceCreateDeviceRGB()
    let oldComponents = CGColorGetComponents(self.CGColor)
    let components = [oldComponents[0], oldComponents[0], oldComponents[0], oldComponents[1]]
    let colorRef = CGColorCreate(colorSpaceRGB, components)
    let convertedColor = UIColor(CGColor: colorRef!)
    return convertedColor
}

}


0

Розширення до UIColor, використовуючи функції Swift 2.2. Однак зауважте, що оскільки порівнюються значення RGBA, і це CGFloat, помилки округлення можуть призвести до того, що кольори не повертаються як рівні, якщо вони не є однаковими (наприклад, вони спочатку не були створені з використанням таких самих властивостей у init (...)!).

/**
 Extracts the RGBA values of the colors and check if the are the same.
 */

public func isEqualToColorRGBA(color : UIColor) -> Bool {
    //local type used for holding converted color values
    typealias colorType = (red : CGFloat, green : CGFloat, blue : CGFloat, alpha : CGFloat)
    var myColor         : colorType = (0,0,0,0)
    var otherColor      : colorType = (0,0,0,0)
    //getRed returns true if color could be converted so if one of them failed we assume that colors are not equal
    guard getRed(&myColor.red, green: &myColor.green, blue: &myColor.blue, alpha: &myColor.alpha) &&
        color.getRed(&otherColor.red, green: &otherColor.green, blue: &otherColor.blue, alpha: &otherColor.alpha)
        else {
            return false
    }
    log.debug("\(myColor) = \(otherColor)")
    //as of Swift 2.2 (Xcode 7.3.1), tuples up to arity 6 can be compared with == so this works nicely
    return myColor == otherColor
}

0

Розширення UIColor

- (CGFloat)accuracyCompareWith:(UIColor *)color {
    CIColor *c1 = [[CIColor alloc] initWithColor:self];
    CIColor *c2 = [[CIColor alloc] initWithColor:color];

    BOOL hasAlpha = c1.numberOfComponents == 4 && c2.numberOfComponents == 4;
    NSInteger numberOfComponents = hasAlpha ? 4 : 3;

    CGFloat colorMax = 1.0;
    CGFloat p = colorMax / 100.0;

    CGFloat redP = fabs(c1.red / p - c2.red / p);
    CGFloat greenP = fabs(c1.green / p - c2.green / p);
    CGFloat blueP = fabs(c1.blue / p - c2.blue / p);
    CGFloat alphaP = 0;

    if (hasAlpha)
        alphaP = fabs(c1.alpha / p - c2.alpha / p);

    return (redP + greenP + blueP + alphaP) / (CGFloat)numberOfComponents;
}

0

Я перетворив відповідь raf на Swift 4 (багато змін в CGColorAPI), видалив силу розгортання та зменшив відступ завдяки щедрому використанню guard:

@extension UIColor {
    func isEqualToColor(otherColor: UIColor) -> Bool {
        if self == otherColor {
            return true
        }
        let colorSpaceRGB = CGColorSpaceCreateDeviceRGB()
        let convertColorToRGBSpace: ((UIColor) -> UIColor?) = { (color) -> UIColor? in
            guard color.cgColor.colorSpace?.model == .monochrome else {
                return color
            }
            guard let oldComponents = color.cgColor.components else {
                return nil
            }
            let newComponents = [oldComponents[0], oldComponents[0], oldComponents[0], oldComponents[1]]
            guard let colorRef = CGColor(colorSpace: colorSpaceRGB, components: newComponents) else {
                    return nil
            }
            return UIColor(cgColor: colorRef)
        } 

        guard let selfColor = convertColorToRGBSpace(self), 
              let otherColor = convertColorToRGBSpace(otherColor) else {
            return false
        }
        return selfColor.isEqual(otherColor)
    }
}

0

Чому б не додати розширення з вирівняним протоколом? Ця відповідь використовує рішення Ніколя Міарі. Тож, якщо вам подобається ця відповідь, будь ласка, ласкаво просимо сподобатися його відповіді (друге зверху)

Коментар Зула: Будьте уважні, порівнюючи кольори таким чином, оскільки вони повинні бути в одній кольоровій моделі, щоб вважати рівними. Наприклад, #ffffff не дорівнює [UIColor whiteColor]

static func == (lhs: UIColor, rhs: UIColor) -> Bool {

    let colorSpaceRGB = CGColorSpaceCreateDeviceRGB()
    let convertColorToRGBSpace: ((UIColor) -> UIColor?) = { (color) -> UIColor? in
        guard color.cgColor.colorSpace?.model == .monochrome else {
            return color
        }
        guard let oldComponents = color.cgColor.components else {
            return nil
        }
        let newComponents = [oldComponents[0], oldComponents[0], oldComponents[0], oldComponents[1]]
        guard let colorRef = CGColor(colorSpace: colorSpaceRGB, components: newComponents) else {
            return nil
        }
        return UIColor(cgColor: colorRef)
    }

    guard let selfColor = convertColorToRGBSpace(lhs),
        let otherColor = convertColorToRGBSpace(rhs) else {
            return false
    }
    return selfColor.isEqual(otherColor)
}

0

Хоча відповідь @ samvermette дуже хороша, я виявив, що іноді це може призвести до помилкових негативів при порівнянні різних типів кольорів (у моєму випадку UIDeviceRGBColorз UICachedDeviceWhiteColor). Я виправив це, також чітко створивши колір у полі `else ':

- (BOOL)isEqualToColor:(UIColor *)otherColor
{
    if (self == otherColor)
        return YES;

    CGColorSpaceRef colorSpaceRGB = CGColorSpaceCreateDeviceRGB();

    UIColor *(^convertColorToRGBSpace)(UIColor*) = ^(UIColor *color)
    {
        if (CGColorSpaceGetModel(CGColorGetColorSpace(color.CGColor)) == kCGColorSpaceModelMonochrome)
        {
            const CGFloat *oldComponents = CGColorGetComponents(color.CGColor);
            CGFloat components[4] = {oldComponents[0], oldComponents[0], oldComponents[0], oldComponents[1]};
            CGColorRef colorRef = CGColorCreate(colorSpaceRGB, components);
            UIColor *color = [UIColor colorWithCGColor:colorRef];
            CGColorRelease(colorRef);
            return color;
        }
        else
        {
            const CGFloat *oldComponents = CGColorGetComponents(color.CGColor);
            CGFloat components[4] = {oldComponents[0], oldComponents[1], oldComponents[2], oldComponents[3]};
            CGColorRef colorRef = CGColorCreate(colorSpaceRGB, components);
            UIColor *color = [UIColor colorWithCGColor:colorRef];
            CGColorRelease(colorRef);
            return color;
        }
    };

    UIColor *selfColor = convertColorToRGBSpace(self);
    otherColor = convertColorToRGBSpace(otherColor);
    CGColorSpaceRelease(colorSpaceRGB);

    return [selfColor isEqual:otherColor];
}


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.