2014-07-18 2 views
1

이미지 캡처와 관련된 창 예제를 읽었습니다. 이 기사는 http://msdn.microsoft.com/en-us/library/dd183402(v=vs.85).aspx에 있습니다. 내게 닥친 한 가지는 비트 맵 크기의 계산이었습니다. 그것은이 있었다 :비트 맵 크기가 이렇게 계산되는 이유는 무엇입니까?

DWORD dwBmpSize = ((bmpScreen.bmWidth * bi.biBitCount + 31)/32) * 4 * bmpScreen.bmHeight; 

내가 더 이런 일 것으로 예상 :

DWORD dwBmpSize = bmpScreen.bmWidth * bmpScreen.bmHeight * bi.biBitCount/8; 

겠습니까 전자의 포인트를 설명하는 사람의 마음?

감사합니다.

답변

2

비트 맵은 일련의 수평 주사선으로 표시됩니다. 그 표현의 가장 작은 분리 할 수없는 단위는 32 비트 단어입니다. 이 단어는 스캔 라인간에 절대 공유되지 않습니다. 즉, 스캔 라인의 마지막 단어가 완전히 사용되지 않으면 그 방법으로 남습니다 (사용되지 않은 비트의 가비지 값이 가장 높을 가능성이 큽니다). 그리고 다음 주사선은 새로운 32 비트 단어로 시작됩니다. 예를 들어 비트 맵의 ​​너비가 1 픽셀 밖에되지 않는 경우에도 전체 32 비트 단어를 사용하여 각 비트 맵 행을 나타냅니다.

위의 공식은 비트 맵의 ​​한 스캔 라인을 표시하는 데 필요한 32 비트 단어의 수를 계산하는 것으로 시작됩니다. 이것은 바로 ... + 31)/32 트릭이하는 것입니다. 일반적으로 부호없는 산술 (A + B - 1)/BAB으로 나눈 값을 반올림하여 계산합니다. 따라서 ((bmpScreen.bmWidth * bi.biBitCount + 31)/32 부분은 비트 맵의 ​​한 줄을 나타내는 데 필요한 32 비트 단어의 수를 알려줍니다. 그런 다음 비트 맵의 ​​한 줄을 나타내는 데 필요한 8 비트 바이트의 수를 알려주는 4를 곱합니다.

마지막으로 bmpScreen.bmHeight을 곱하면 전체 비트 맵의 ​​총 8 비트 바이트 수를 얻을 수 있습니다.

+0

아, 그렇다면 RGB32에서 내 계산과이 계산은 항상 같을 것입니다. 맞습니까? 이것은 주로 픽셀 당 비트 수가 적은 색 공간을위한 것입니까? – anoneironaut

관련 문제