2010-12-16 1 views
1

픽셀 값에서 RGB를 추출하는 방법입니다. 다음은 코드 스 니펫입니다.C# WriteableBitmapEx 픽셀을 미리 곱하는 픽셀

 Byte a = (Byte)(myColor >> 24); 
     // Prevent division by zero 
     UInt32 ai = a; 
     if (ai == 0) 
     { 
      ai = 1; 
     } 
     ai = ((255 << 8)/ai); 
     Byte bA = a; 
     Byte bR = (Byte)((((myColor >> 16) & 0xFF) * ai) >> 8); 
     Byte bG = (Byte)((((myColor >> 8) & 0xFF) * ai) >> 8); 
     Byte bB = (Byte)((((myColor & 0xFF) * ai) >> 8)); 

기술적으로, 즉 비트 수준에서, 그리고 무슨 일이 일어나고 있는지 이해합니다. 특히 'Byte b # = (Byte) (((myColor >> n) & 0xFF)'부분을 이해합니다. 내가 이해할 수없는 것은 미리 곱하기입니다. 255 알파만큼 오른쪽으로 8 비트만큼 이동 한 후 나누어하는 이유

  1. 가 왜 각각의 값은 다음이과의 결과를 곱한되고 그래서 제 질문하고 - 이해하고 싶어? 왼쪽으로 8 비트 이동 했습니까?
+0

여기를 참조하십시오. –

+0

내 질문에 따라 코드를 이해하고 있습니까? – descf

답변

1

정수 나누기를 사용하는 동안 정밀도를 높이려면 정수 연산자를 사용하는 이유는 다음과 같습니다. fo 속도.

If MyColor = 0xAABBCCDD 
AA = 170 
BB = 187 
CC = 204 
DD = 221 

Expected values: 
bA = 170 
bR = 187 * (255/170) = 280.5 
bG = 204 * (255/170) = 306 
bB = 221 * (255/170) = 331.5 

with integer division 255/170, 255/204, 255/221 will all evaluate to 1 and premultiplication becomes ineffective. 

By using this operation ai = ((255 << 8)/ai) 
with integer division: ai = (255*256)/170 = 384 
and subsequent multiplications and shifts gives you a more accurate result. 
E.g. 
bR = 187 * 384/256 = 280 
bG = 204 * 384/256 = 306 
bB = 221 * 384/256 = 331 

이것이 알파 사전 곱셈에 대한 좋은 공식이라고 확신하지 못한다고 했으니 까.

자세한 내용은 Fixed Point Arithmetic

관련 문제