【问题标题】:sRGB to NSColorsRGB 转 NSColor
【发布时间】:2019-02-20 06:11:27
【问题描述】:

我正在尝试在 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 的:link

将 sRGB 转换为 NSColor 的方法取自这里的另一篇文章,但显然它不起作用。

最好的问候

【问题讨论】:

    标签: cocoa nsview nscolor


    【解决方案1】:

    您的代码几乎完全正确,唯一的问题是您在数组中使用了 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}
    

    然后您的代码将正常工作。请注意,使用 NSColorcolorWithCalibratedRed:green:blue:alpha: 方法将不会根据您的 sRGB 值为您提供正确的颜色。

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

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

    【讨论】:

    • 太棒了。为我自己的目的而解除:)
    【解决方案2】:

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

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

    【讨论】:

      【解决方案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];
      

      【讨论】:

      • 谢谢,很抱歉我没有足够的声誉来推动您的回答。
      • @jopjip 没问题,很高兴这对您有所帮助。
      • 这与使用 sRGB 值生成颜色相同。这是使用当前校准的 RGB 颜色空间生成颜色,绝对不能保证是 sRGB。如果输入 sRGB 值,您将无法获得正确的颜色。
      • @RobKeniger 我建议使用 RGB 而不是 sRGB。我知道它们之间的区别,但是使用 RGB 比使用 sRGB 更容易获得你想要的颜色。
      • 不,不是。对于程序员来说可能更简单,但这并不意味着你得到的颜色是正确的。 sRGB 是标准色彩空间。如果您进入 Photoshop 并将文档的颜色模型设置为 sRGB,那么您可以保证使用吸管测量 R184、G184、B184 的像素如果使用sRGB 颜色空间,正如我在回答中所解释的那样。如果您采用该 sRGB 值并将其与NSCalibratedRGBColorSpace 一起使用,则颜色将相同。试试看。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-27
      • 1970-01-01
      • 1970-01-01
      • 2016-04-01
      • 1970-01-01
      相关资源
      最近更新 更多