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.