将十六进制颜色代码转换为NSColor

15

我在将十六进制代码转换为NSColor时遇到了一些问题。请注意,这是用于Mac应用程序的(因此使用NSColor而不是UIColor)。这是我目前拥有的代码:

- (NSColor *) createNSColorFromString:(NSString *)string {
NSString* hexNum = [string substringFromIndex:1];
NSColor* color = nil;
unsigned int colorCode = 0;
unsigned char red, green, blue;
if (string) {
    NSScanner* scanner = [NSScanner scannerWithString:hexNum];
    (void) [scanner scanHexInt:&colorCode];
}
red = (unsigned char) (colorCode >> 16);
green = (unsigned char) (colorCode >> 8);
blue = (unsigned char) (colorCode);
color = [NSColor colorWithCalibratedRed:(float)red / 0xff green:(float)green / 0xff blue:(float)blue / 0xff alpha:1.0];
return color;

}

希望能得到任何帮助。


你能提供一个string值的示例吗? - Andrew Madsen
从输入中,你得到了哪些红色绿色蓝色的值? - Peter Hosey
以上数值的输出为0.2 0.6 0.4 1,其中最后一个是alpha。 - mdominick
6个回答

28
+ (NSColor*)colorWithHexColorString:(NSString*)inColorString
{
    NSColor* result = nil;
    unsigned colorCode = 0;
    unsigned char redByte, greenByte, blueByte;

    if (nil != inColorString)
    {
         NSScanner* scanner = [NSScanner scannerWithString:inColorString];
         (void) [scanner scanHexInt:&colorCode]; // ignore error
    }
    redByte = (unsigned char)(colorCode >> 16);
    greenByte = (unsigned char)(colorCode >> 8);
    blueByte = (unsigned char)(colorCode); // masks off high bits

    result = [NSColor
    colorWithCalibratedRed:(CGFloat)redByte / 0xff
    green:(CGFloat)greenByte / 0xff
    blue:(CGFloat)blueByte / 0xff
    alpha:1.0];
    return result;
    }

它没有考虑alpha值,而是假设像"FFAABB"这样的值,但很容易进行修改。


嗯,我似乎得到了与我的相同的值:0.2 0.6 0.4 1,这对我来说似乎非常错误... - mdominick
@mdominick,这些看起来是0x339966的正确值。0x33 = 51,51/255 = 0.2。0x99 = 153,153/255 = 0.6。0x66 = 102,102/255 = 0.4。你期望的数值是什么? - Caleb
哎呀,@Caleb 你说得对。出于某种原因,我本来期望得到51,153,52...。感谢大家的帮助。有点难过,想想自己一直都是正确的,却盯着这个问题看了几个小时... - mdominick
1
@mdominick 我相信你不是第一个犯这个错误的人。请记住,NSColor使用的组件都是介于0和1之间的浮点数。 - Caleb
5
问题提问者的代码有什么问题?为什么这段代码更好? - Peter Hosey

8

以下是两个非常有用的宏:

#define RGBA(r,g,b,a) [NSColor colorWithCalibratedRed:r/255.f green:g/255.f blue:b/255.f alpha:a/255.f]

#define NSColorFromRGB(rgbValue) [NSColor colorWithCalibratedRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0 green:((float)((rgbValue & 0xFF00) >> 8))/255.0 blue:((float)(rgbValue & 0xFF))/255.0 alpha:1.0]

宏是实用的,但通常因为很多原因而不好。 - uchuugaka

4
这是Zlatan上面回答的适用于Swift 2的版本(+1给他!):
func getColorFromString(webColorString : String) -> NSColor?
{
    var result : NSColor? = nil
    var colorCode : UInt32 = 0
    var redByte, greenByte, blueByte : UInt8

    // these two lines are for web color strings that start with a #
    // -- as in #ABCDEF; remove if you don't have # in the string
    let index1 = webColorString.endIndex.advancedBy(-6)
    let substring1 = webColorString.substringFromIndex(index1)

    let scanner = NSScanner(string: substring1)
    let success = scanner.scanHexInt(&colorCode)

    if success == true {
        redByte = UInt8.init(truncatingBitPattern: (colorCode >> 16))
        greenByte = UInt8.init(truncatingBitPattern: (colorCode >> 8))
        blueByte = UInt8.init(truncatingBitPattern: colorCode) // masks off high bits

        result = NSColor(calibratedRed: CGFloat(redByte) / 0xff, green: CGFloat(greenByte) / 0xff, blue: CGFloat(blueByte) / 0xff, alpha: 1.0)
    }
    return result
}

0

0

支持7种十六进制类型:

NSColorParser.nsColor("#FF0000",1)//red nsColor
NSColorParser.nsColor("FF0",1)//red nsColor
NSColorParser.nsColor("0xFF0000",1)//red nsColor
NSColorParser.nsColor("#FF0000",1)//red nsColor
NSColorParser.nsColor("FF0000",1)//red nsColor
NSColorParser.nsColor(0xFF0000,1)//red nsColor
NSColorParser.nsColor(16711935,1)//red nsColor

http://stylekit.org/blog/2015/11/09/Supporting-7-Hex-color-types/

注意:这不是即插即用的,您需要在代码中深入挖掘一下。但所有内容都在那里,而且可能比自己编写更快。


0
+(NSColor *) colorWithHexString:(NSString *)hexString alpha:(CGFloat)alpha {
    unsigned long int hexValue = strtoul(hexString.UTF8String, NULL, 16);
    return [NSColor colorWithHex:hexValue alpha:alpha];
}

+(NSColor *) colorWithHex:(unsigned long int)hexValue alpha:(CGFloat)alpha {
    return [NSColor colorWithRed:((float)((hexValue & 0xFF0000) >> 16))/255.0
                           green:((float)((hexValue & 0x00FF00) >>  8))/255.0
                            blue:((float)((hexValue & 0x0000FF) >>  0))/255.0
                           alpha:alpha];
}

您可能需要:

#include <stdlib.h>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接