문제

나는 nscolor를 가지고 있으며, 그것이 대표하는 32 비트 RGBA 값을 정말로 원합니다. 플로트 구성 요소를 추출 한 다음, 곱하기 및 켜지고 일반적으로 거칠고 엔디 언에 의존하는 일을하는 것 외에도이를 얻는 쉬운 방법이 있습니까?

편집 : 도와 주셔서 감사합니다. 실제로, 내가 바랐던 것은 이미 이것을 한 코코아 기능이지만, 나는 그것을 직접하는 것이 좋습니다.

도움이 되었습니까?

해결책

또 다른 무차별 인력 접근법은 임시 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는 코어 그래픽 및 내가 믿는 핵심 이미지의 기본 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;

다른 팁

모든 색상은 아닙니다 가지다 RGBA 표현. RGBA에서 근사치가있을 수 있지만 정확하거나 정확하지 않을 수도 있습니다. 또한 코어 그래픽에 의해 패턴으로 그려진 "색상"이 있습니다 (예 : Mac OS X의 일부 릴리스의 창 배경).

4 개의 플로트를 정수 표현으로 변환하지만이를 달성하고자하는 것이 유일한 방법입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top