gpt4 book ai didi

cocoa - 从 NSColor 中提取 32 位 RGBA 值

转载 作者:行者123 更新时间:2023-12-03 16:50:02 25 4
gpt4 key购买 nike

我有一个 NSColor,我真的想要它代表的 32 位 RGBA 值。除了提取浮点分量,然后乘法和或运算以及通常做粗略的、依赖于字节序的事情之外,还有什么简单的方法可以实现这一点吗?

编辑:感谢您的帮助。真的,我所希望的是 Cocoa 函数已经做到了这一点,但我很乐意自己做。

最佳答案

另一种更强力的方法是创建一个临时的 CGBitmapContext 并填充颜色。

NSColor *someColor = {whatever};
uint8_t data[4];

CGContextRef ctx = CGBitmapContextCreate((void*)data, 1, 1, 8, 4, colorSpace, kCGImageAlphaFirst | kCGBitmapByteOrder32Big);

CGContextSetRGBFillColor(ctx, [someColor redComponent], [someColor greenComponent], [someColor blueComponent], [someColor alphaComponent]);

CGContextFillRect(ctx, CGRectMake(0,0,1,1));

CGContextRelease(ctx);

FWIW,每个组件颜色值 8 位不存在字节序问题。字节序仅适用于 16 位或更大的整数。您可以按照您想要的任何方式布置内存,但无论是大端还是小端机器,8 位整数值都是相同的。 (我相信 ARGB 是 Core Graphics 和 Core Image 的默认 8 位格式)。

为什么不只是这个?:

uint32_t r = (uint32_t)(MIN(1.0f, MAX(0.0f, [someColor redComponent])) * 255.0f);
uint32_t g = (uint32_t)(MIN(1.0f, MAX(0.0f, [someColor greenComponent])) * 255.0f);
uint32_t b = (uint32_t)(MIN(1.0f, MAX(0.0f, [someColor blueComponent])) * 255.0f);
uint32_t a = (uint32_t)(MIN(1.0f, MAX(0.0f, [someColor alphaComponent])) * 255.0f);
uint32_t value = (r << 24) | (g << 16) | (b << 8) | a;

然后你就知道它在内存中是如何布局的。

或者这个,如果你更清楚的话:

uint8_t r = (uint8_t)(MIN(1.0f, MAX(0.0f, [someColor redComponent])) * 255.0f);
uint8_t g = (uint8_t)(MIN(1.0f, MAX(0.0f, [someColor greenComponent])) * 255.0f);
uint8_t b = (uint8_t)(MIN(1.0f, MAX(0.0f, [someColor blueComponent])) * 255.0f);
uint8_t a = (uint8_t)(MIN(1.0f, MAX(0.0f, [someColor alphaComponent])) * 255.0f);

uint8_t data[4];
data[0] = r;
data[1] = g;
data[2] = b;
data[3] = a;

关于cocoa - 从 NSColor 中提取 32 位 RGBA 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/322333/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com