sRGB в NSColor

Я пытаюсь нарисовать внутреннюю тень в NSView. Сама тень не проблема, но настройка цвета сводит меня с ума :/

#define ShadowBlurRadius 10.0
#define SRGB (CGFloat [4]){184.0, 184.0, 184.0, 1.0}

@implementation SWShadowedView

- (void)drawRect:(NSRect)dirtyRect {

NSGraphicsContext *context = [NSGraphicsContext currentContext];
[context saveGraphicsState];

[context setCompositingOperation:NSCompositePlusDarker];


NSBezierPath *path = [NSBezierPath bezierPathWithRect:NSMakeRect(0, dirtyRect.size.height -ShadowBlurRadius, self.superview.frame.size.width, ShadowBlurRadius)];

[[NSColor whiteColor] setStroke];

NSShadow * shadow = [[NSShadow alloc] init];

NSColorSpace *colorSpace = [NSColorSpace sRGBColorSpace];

NSColor *color = [NSColor colorWithColorSpace:colorSpace components:SRGB count:4];

[shadow setShadowColor:color];

[shadow setShadowBlurRadius:ShadowBlurRadius];
[shadow set];

[path stroke];

[context restoreGraphicsState];

[super drawRect:dirtyRect];
}

@end

Если я заменю цвет тени на [NSColor redColor], он будет работать, но с неправильным цветом. Вот откуда я взял sRGB: ссылка

Способ преобразования sRGB в NSColor взят из другого поста отсюда, но, очевидно, он не работает.

с уважением


person jopjip    schedule 09.03.2012    source источник


Ответы (3)


Используйте RGB вместо sRGB:

Вы можете создать цвет с помощью RGB следующим образом:

float red = 182.0f/256.0f;
float green = 182.0f/256.0f;
float blue = 182.0f/256.0f;


NSColor *color = [NSColor colorWithCalibratedRed:red green:green blue:blue alpha:1.0f];
person Justin Boo    schedule 09.03.2012
comment
Спасибо, извините, у меня недостаточно репутации, чтобы подтолкнуть ваш ответ. - person jopjip; 09.03.2012
comment
@jopjip Нет проблем, я рад, что это помогло Вам. - person Justin Boo; 09.03.2012
comment
Это НЕ то же самое, что создание цвета с использованием значений sRGB. Это генерирует цвет с использованием текущего откалиброванного цветового пространства RGB, которое определенно не является sRGB. Вы не получите правильный цвет, если введете значения sRGB. - person Rob Keniger; 10.03.2012
comment
@RobKeniger Я предлагаю использовать RGB вместо sRGB. Я знаю различия, но с RGB гораздо проще получить именно тот цвет, который вам нужен, чем с sRGB. - person Justin Boo; 10.03.2012
comment
Нет, это не так. Программисту может быть проще, но это не значит, что цвет, который вы получите, будет правильным. sRGB — стандартное цветовое пространство. Если вы войдете в Photoshop и установите цветовую модель своего документа на sRGB, то можете гарантировать, что пиксель, который измеряет R184, G184, B184 с помощью пипетки, будет выглядеть точно в вашем приложении, если вы используете Цветовое пространство sRGB, как я объяснил в своем ответе. Если вы возьмете это значение sRGB и используете его с NSCalibratedRGBColorSpace, тогда цвет другой будет таким же. Попробуйте и посмотрите. - person Rob Keniger; 10.03.2012
comment
Я согласен с Робом, этот ответ очень вводит в заблуждение, и никогда не следует советовать использовать RGB вместо sRGB, не прояснив, что подразумевается под RGB. - person sam hocevar; 23.01.2013

Ваш код почти полностью правильный, единственная проблема в том, что вы используете числовые значения от 0 до 255 в своем массиве. Все методы создания NSColor используют значения CGFloat от 0 до 1.0.

Все, что вам нужно сделать, это определить свой массив SRGB следующим образом:

#define SRGB (CGFloat [4]){184.0/255.0, 184.0/255.0, 184.0/255.0, 1.0}

Тогда ваш код будет работать правильно. Обратите внимание, что использование метода colorWithCalibratedRed:green:blue:alpha: из NSColor не даст вам правильный цвет из ваших значений sRGB.

Чтобы получить правильные значения sRGB, вы должны использовать метод в исходном коде, который специально использует цветовое пространство sRGB для создания цвета. Категория на NSColor, которая создает цвета с использованием значений sRGB на основе 255, может выглядеть примерно так:

@implementation NSColor (sRGB_Additions)
+ (NSColor *)colorWith255sRGBRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha
{
    CGFloat sRGBComponents[4] = {red / 255.0, green / 255.0, blue / 255.0, alpha};
    NSColorSpace *colorSpace = [NSColorSpace sRGBColorSpace];
    return [NSColor colorWithColorSpace:colorSpace components:sRGBComponents count:4];
}
@end

Тогда вы можете просто сделать это:

NSColor* someColor = [NSColor colorWith255sRGBRed:184.0 green:184.0 blue:184.0 alpha:1.0];
person Rob Keniger    schedule 10.03.2012
comment
Потрясающий. Снято в личных целях :) - person uchuugaka; 09.01.2014

Вот самый простой и современный способ создания нужного вам цвета:

NSColor *color = [NSColor colorWithSRGBRed:(184.0 / 255.5) green:(184.0 / 255.5) blue:(184.0 / 255.5) alpha:1.0];
person Stargazer    schedule 19.02.2019