2012-04-21 2 views
0

코드는 이미지 모양의 단추를 만드는 데 도움이되는 Qt 라이브러리에서 가져온 것입니다. 그것은 픽셀의 rgb 부분이 마스킹과 일치 할 때 다음의 변화를 생성하는 모든 라인 y와 모든 너비 x를 스캔합니다 (mp는 라인 시작 부분의 포인터이며 미리 0xff로 채워집니다) :이미지 처리 비트 단위 명령 개념 해석

* (mp + (x >> 3)) & = ~ (1 < < (x & 7));

나는 그것을 실제로 해석 할 수 없다. 손을 대주는 배경을 가진 사람?

답변

1

코드의 모양에서 mp는 픽셀 이미지 당 1 비트의 현재 줄을 가리 킵니다. 코드는 X에서 픽셀을 나타내는 비트를 지 웁니다. X 오프셋을 바이트 오프셋 (x >> 3)으로 변환 한 다음 바이트 내에서 X 위치만큼 왼쪽으로 시프트 된 역 1에서 생성 된 마스크를 사용하여 논리 AND를 수행합니다.

0

; 좋아, 배경 : http://www.cprogramming.com/tutorial/bitwise_operators.html; & = 우리는 비트 곱셈을 할 것임을 의미합니다. rhs에서 ~는 보완을위한 것이므로 0과 viceversa로 1을 반전합니다. 바이너리에서 7은 끝에 3 개가 있고 맨 앞에 모두 0이므로 x & 7은 x의 마지막 3 비트를 보존합니다. < <와 결합하면 첫 번째 비트의 1을 왼쪽으로 char 1에서 지수에 따라 특정 수만큼 이동합니다. 지수는 x의 마지막 3 비트만을 사용하기 때문에 8보다 작습니다 (2^3). 그래서 하나의 비트는 char의 8 비트 내에서 1-8 위치에있게됩니다. 플립 ~은 그 마법의 위치를 ​​제외한 모든 것을 1로 만듭니다. & =에 의해 수행 된 곱셈은 1 비트를 제외하고는 lhs의 모든 것을 보존합니다. 지금은 lhs; 우리는 오른쪽 시프트 연산에서 >>를 사용하여 x의 마지막 바이트 또는 마지막 3 비트를 시작합니다. 이것은 우리가 x의 8 증분마다 동일한 바이트 (mp의 문자 유형)를 수정할 위치를 의미합니다. 우리가 "점프"할 때, 우리는 단 한 바이트 만 그렇게 할 것입니다; x = 9 일 때 mp + 1로 가고, x = 17 일 때 mp + 2로 갈 것입니다; 따라서 정수 연산에서는 x/2^3과 같지만 한 시프트 연산에서는 x/2^3과 같습니다. 이제 우리는 모든 것을 이해할 수있는 요소를 갖게되었습니다.

tmask는 모두 0xff로 채워져 있습니다. 이는 & = operation에서 수동적 일 것이며 rhs가 독단적으로 말하는 것을 보존한다는 것을 의미합니다. 즉, 특정 픽셀이 배경과 동일한 지 검사하는 if 문에 히트가있는 경우이 줄이 실행되고 픽셀과 관련된 특정 비트가 지워집니다.