NSColorPanel для шестнадцатеричного выпуска?

У меня есть NSColorPanel, который я ввожу значения RGV:

NSColorPanel * sharedPanel = [NSColorPanel sharedColorPanel];
[sharedPanel setTarget: self];
[sharedPanel setAction: updateColor:];
[sharedPanel orderFront: self];

Цветная панель дисплея и я устанавливаю это значение: r66, g114, b170

По моим расчетам это должно быть #4272AA. Я использую следующий код для преобразования в шестнадцатеричный код:

- (void) updateColor: (NSColorPanel*) panel
{
    NSString * hexString = [panel.color hexadecimalValueOfAnNSColor];
    NSLog(@"%@", hexString);
}

Который выходит из системы #345d9a (не то, что я ожидал).

Я использую следующий метод непосредственно из developer.apple.com, чтобы преобразовать цвет в гекс:

#import <Cocoa/Cocoa.h>
@interface NSColor(NSColorHexadecimalValue) 
-(NSString *)hexadecimalValueOfAnNSColor;
@end

@implementation NSColor(NSColorHexadecimalValue)

-(NSString *)hexadecimalValueOfAnNSColor
{
    float redFloatValue, greenFloatValue, blueFloatValue;
    int redIntValue, greenIntValue, blueIntValue;
    NSString *redHexValue, *greenHexValue, *blueHexValue;

  //Convert the NSColor to the RGB color space before we can access its components
    NSColor *convertedColor=[self colorUsingColorSpaceName:NSCalibratedRGBColorSpace];

    if(convertedColor)
    {
        // Get the red, green, and blue components of the color
        [convertedColor getRed:&redFloatValue green:&greenFloatValue blue:&blueFloatValue alpha:NULL];

        // Convert the components to numbers (unsigned decimal integer) between 0 and 255
        redIntValue=redFloatValue*255.99999f;
        greenIntValue=greenFloatValue*255.99999f;
        blueIntValue=blueFloatValue*255.99999f;

        // Convert the numbers to hex strings
        redHexValue=[NSString stringWithFormat:@"%02x", redIntValue]; 
        greenHexValue=[NSString stringWithFormat:@"%02x", greenIntValue];
        blueHexValue=[NSString stringWithFormat:@"%02x", blueIntValue];

        // Concatenate the red, green, and blue components' hex strings together with a "#"
        return [NSString stringWithFormat:@"#%@%@%@", redHexValue, greenHexValue, blueHexValue];
    }
    return nil;
}
@end

Любые предложения относительно того, что я делаю неправильно?

1 ответ

Решение

Вы, должно быть, ввели координаты в другом цветовом пространстве (вероятно, устройства, поскольку на моем MaC#4272AA в цветовом пространстве моего дисплея при преобразовании в калиброванное цветовое пространство дает почти тот же результат, #345C9A).

Чтобы изменить цветовое пространство в NSColorPanel нажмите крошечную кнопку радуги. NSCalibratedRGBColorSpace соответствует выбору "Generic RGB" - поскольку ваш метод get-hex использует откалиброванный, вам нужно использовать то же самое, если вы хотите получить те же числа обратно.

введите описание изображения здесь

Небольшое предупреждение: этот кусок кода от developer.apple.com вреден.

  • Когда люди говорят друг другу шестнадцатеричные коды, почти повсеместно предполагается, что они означают тот же цвет, что и HTML/CSS. Это означает, что шестнадцатеричные коды должны находиться в цветовом пространстве sRGB, поскольку веб-стандарты предписывают использовать sRGB всякий раз, когда информация о цветовом пространстве пропущена / отсутствует.
  • Apple "Generic RGB" (NSCalibratedRGBColorSpace) очень отличается от sRGB и собственных цветовых пространств большинства современных дисплеев. Ваша проблема просто показывает, насколько велика эта разница.
  • Большинство дисплеев в мире производятся так, чтобы максимально соответствовать sRGB, и особенно хороши высококачественные дисплеи современных устройств Apple.
  • Это приводит к несколько неожиданному выводу: если нужны эти шестнадцатеричные коды для получения тех же цветов, что и в HTML, используя NSDeviceRGBColorSpace Однако неправильно, что вместо NSCalibratedRGBColorSpace дает гораздо лучшие результаты. Вы можете легко проверить этот факт, введя одинаковые цветовые координаты в цветовом пространстве Device, Generic и sRGB и сравнив с тем, что создает HTML-страница в Safari.
  • Если вам нужно точное и гарантированное совпадение с шестнадцатеричными кодами, используемыми в сети, вам придется вручную преобразовывать цвета в sRGB, поскольку NSColor не поддерживает считывание компонентов для любых цветовых профилей, кроме Device RGB и Calibrated RGB.
Другие вопросы по тегам