sRGB a NSColor

Estoy tratando de dibujar una sombra interior en un NSView. La sombra en sí no es el problema, pero la configuración de color me está volviendo loco :/

#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

Si reemplazo el color de la sombra con [NSColor redColor], funciona pero con el color incorrecto. Aquí es donde obtuve el sRGB de: enlace

La forma de convertir sRGB a NSColor se toma de otra publicación de aquí, pero obviamente no funciona.

saludos cordiales

preguntado el 09 de marzo de 12 a las 14:03

3 Respuestas

Su código es casi completamente correcto, el único problema es que está usando valores numéricos de 0 a 255 en su matriz. Todos NSColor uso de métodos de creación CGFloat valores de 0-1.0.

Todo lo que necesita hacer es definir su SRGB matriz así:

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

Su código entonces funcionará correctamente. Tenga en cuenta que el uso de la colorWithCalibratedRed:green:blue:alpha: método de NSColorno darle el color correcto de sus valores sRGB.

Para obtener valores sRGB correctos, debe usar el método en su código original, que usa específicamente el espacio de color sRGB para crear el color. Una categoría en NSColor que crea colores usando valores sRGB basados ​​en 255 podría verse así: 

@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

Entonces podrías hacer esto:

NSColor* someColor = [NSColor colorWith255sRGBRed:184.0 green:184.0 blue:184.0 alpha:1.0];

Respondido 15 Abr '16, 09:04

Impresionante. Levantado para mis propios fines :) - uchuugaka

Esta es la forma más sencilla y moderna de crear el color que necesita:

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

Respondido 19 Feb 19, 22:02

Utilizan RGB no sRGB:

Puedes crear color con RGB como este:

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];

respondido 09 mar '12, 16:03

Gracias, lo siento, no tengo suficiente reputación para presionar tu respuesta. - jopjip

@jopjip No hay problema, me alegro de que esto te haya ayudado. - justin-boo

Es NO lo mismo que generar un color usando valores sRGB. Esto está generando un color utilizando el espacio de color RGB calibrado actual, que definitivamente no se garantiza que sea sRGB. No obtendrá el color correcto si ingresa valores sRGB. - Rob Keniger

@RobKeniger Sugiero usar RGB en lugar de sRGB. Conozco las diferencias, pero con RGB es mucho más fácil obtener exactamente el color que desea que con sRGB. - justin-boo

No, no lo es. Puede que sea más sencillo para el programador, pero eso no significa que el color que obtengas sea el correcto. sRGB es un espacio de color estándar. Si ingresa a Photoshop y configura el modelo de color de su documento en sRGB, puede garantizar que un píxel que mida R184, G184, B184 con el cuentagotas se verá exactamente lo mismo en su aplicación si usa el espacio de color sRGB como expliqué en mi respuesta. Si toma ese valor sRGB y lo usa con el NSCalibratedRGBColorSpace entonces el color será no ser el mismo. Pruébalo y verás. - Rob Keniger

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.