2009-07-28 4 views
1

16 비트 루미넌스 값을 2 바이트로 저장하고 이것을 R, G, B 값으로 변환하고 싶습니다. 두 가지 질문이 있습니다 : 어떻게 그 두 바이트를 짧게 변환하고 색조와 채도가 0이라고 가정하면이 단락을 구성 요소 RGB 값당 8 비트로 변환하는 방법은 무엇입니까? 16 비트 루미넌스 값을 32 비트 RGB로 변환

(변환] 클래스는 두 바이트 및 출력 단락을 할 수있는 옵션이 없습니다.)

답변

2

16 비트 값이 리틀 엔디안이고 부호가없는 경우 2 번째 바이트는 RGB 값을 만들기 위해 3x를 반복하고 다른 바이트는 드롭합니다. 또는 RGB를 32 비트 정수로 사용하려면 비트 시프트를 사용하거나 두 번째 바이트에 0x10101을 더하거나 곱하면됩니다.

+0

그게 바로 제가 고마워해야 할 일입니다! – RCIX

2

이 같은 시도 :

byte luminance_upper = 23; 
byte luminance_lower = 57; 
int luminance = ((int)luminance_upper << 8) | (int)luminance_lower; 

당신에게 65535 사이의 값을 줄 것이다 .

물론 32 비트 ARGB (그레이 스케일) 컬러로 끝내고 싶다면 16 비트 휘도에서 8 비트 R로 이동하기 때문에 하위 바이트는 중요하지 않습니다. , G, B 구성 요소.

byte luminance_upper = 255; 
// assuming ARGB format 
uint argb = (255u << 24)      // alpha = 255 
      | ((uint)luminance_upper << 16) // red 
      | ((uint)luminance_upper << 8) // green 
      | (uint)luminance_upper;   // blue (hope my endianess is correct) 

상황에 따라 더 나은 방법이있을 수 있습니다. 예를 들어 위의 코드는 선형 매핑을 수행하지만 로그 곡선을 사용하여 16 비트 값을 8 비트 RGB 구성 요소에 매핑하면 더 나은 결과를 얻을 수 있습니다.

+0

"32 비트 그레이 스케일 번호"는 "알파, R, G, B를 의미하며 각 비트는 8 비트이고 R = G = B입니다." – Crashworks

+0

네, 조금 더 명확 해지기를 바랍니다. – geofftnz

0

다른 구성 요소 (색조 및 채도)도 필요합니다.

또한 16 비트 사운드가 약간 이상합니다. 일반적으로이 값은 부동 소수점입니다.

많은 색상 공간의 변환을 위해 CodeProject에 아주 좋은 기사가 있습니다.

관련 문제