Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa sRGB到NSColor_Cocoa_Nsview_Nscolor - Fatal编程技术网

Cocoa sRGB到NSColor

Cocoa sRGB到NSColor,cocoa,nsview,nscolor,Cocoa,Nsview,Nscolor,我试图在一个视图中绘制一个内部阴影。阴影本身不是问题,但颜色设置让我抓狂:/ #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 currentCo

我试图在一个视图中绘制一个内部阴影。阴影本身不是问题,但颜色设置让我抓狂:/

#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的方法来自这里的另一篇文章,但显然不起作用


致以最诚挚的问候

使用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];
@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

您的代码几乎完全正确,唯一的问题是您在数组中使用的是0-255之间的数值。所有
NSColor
创建方法都使用0-1.0的
CGFloat

您只需定义
SRGB
数组,如下所示:

#define SRGB (CGFloat [4]){184.0/255.0, 184.0/255.0, 184.0/255.0, 1.0}
然后,您的代码将正常工作。请注意,使用
NSColor
colorWithCalibered:green:blue:alpha:
方法将而不是根据您的sRGB值为您提供正确的颜色

要获得正确的sRGB值,必须使用原始代码中的方法,该方法专门使用sRGB颜色空间来创建颜色。
NSColor
上使用基于255的sRGB值创建颜色的类别可能如下所示:

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

以下是创建所需颜色的最简单、最现代的方法:

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

谢谢,很抱歉我没有足够的声誉来推送你的答案。@jopjip没问题,我很高兴这对你有所帮助。这与使用sRGB值生成颜色不同。这是使用当前校准的RGB颜色空间生成颜色,这绝对不能保证是sRGB。如果输入sRGB值,将无法获得正确的颜色。@RobKeniger我建议使用RGB而不是sRGB。我知道它们的区别,但是使用RGB比使用sRGB更容易得到你想要的颜色。不,不是。对于程序员来说可能更简单,但这并不意味着您得到的颜色是正确的。sRGB是标准颜色空间。如果你进入Photoshop并将文档的颜色模型设置为sRGB,那么你可以保证,如果你使用我在回答中解释的sRGB颜色空间,使用滴管测量R184、G184、B184的像素在你的应用程序中看起来完全相同。如果将该sRGB值与
NSCalibratedRGBColorSpace
一起使用,则颜色将不同。试试看,太棒了。出于我自己的目的:)