안녕하세요 선생님. 81과에서 이해가 잘 되지 않은 부분이 있어 질문드립니다.
첫째, padding을 구하는 부분입니다.
선생님께서 "비트맵 포맷은 픽셀의 가로 한 줄을 저장할 때 4의 배수 크기로 저장하는데 만약 가로 한 줄의 크기가 4의 배수가 아니라면 남는 공간은 0으로 채워서 저장합니다. "라고 하셨습니다.
질문1)그럼 예를 들어서 215 * 300사이즈의 이미지가 있으면 4바이트씩 53번을 채우고 남은 3을 전부 0으로 채운다는 뜻인가요?
질문2)
// 이미지의 가로 크기에 픽셀 크기를 곱하여 가로 한 줄의 크기를 구하고 4로 나머지를 구함 // 그리고 4에서 나머지를 빼주면 남는 공간을 구할 수 있음. // 만약 남는 공간이 0이라면 최종 결과가 4가 되므로 여기서 다시 4로 나머지를 구함 padding = (PIXEL_ALIGN - ((width * PIXEL_SIZE) % PIXEL_ALIGN)) % PIXEL_ALIGN;라고 되있는데요, 여기서 남는 공간을 구하려면 왜 배수 4에서 나머지를 또 빼야하나요? 이미 4로 한번 나눠줬는데 그럼 그게 남은 공간 아닌가요? 그리고
PIXEL_ALIGN - 0 4 - 0 4 // 남는 공간이 잘못된 값이 나옴여기서 4는 왜 잘못된 값인가요??
// 일렬로 된 배열에 접근하기 위해 인덱스를 계산 // (x * 픽셀 크기)는 픽셀의 가로 위치 // (y * (세로 크기 * 픽셀 크기))는 픽셀이 몇 번째 줄인지 계산 // 남는 공간 * y는 줄별로 누적된 남는 공간 int index = (x * PIXEL_SIZE) + (y * (width * PIXEL_SIZE)) + (padding * y);다음은 이 부분입니다... 이 부분은 게시판을 찾아보니 어떤분이 질문을 올리셨더라구요.. 그래서 절반정도 이해한것 같은데 (2차원 배열을 1차원으로 표시)여기서 x에 (또는 y에)pixel size는 왜 곱해야하나요? 또 padding에 y는 왜 곱해줘야되는건지...
그리고 선생님 그 81단원에서 선생님이 말씀하시는 '픽셀 데이터'는 한 점(픽셀)의 데이터를 말씀하시는 건가요 아니면 전체 그림의 데이터를 말씀하시는 건가요??
아ㅏㅏ 이해가 잘 되지 않습니다. ㅠㅠㅠ 괴롭네요.감사합니다 선생님~ㅠㅠ
1 픽셀은 화면에 보이는 점 1개입니다.
색상 정보를 표현하기 위해서는 RGB 각각의 요소에 대한 정보가 필요합니다.
인용한 부분의 앞 부분이 그 전체 코드를 하나씩 나눠서 설명한 것입니다.
---
남는 공간을 구하기 전에 먼저 나머지를 구해야 되는데 계산식은 (가로 크기 * PIXEL_SIZE) % PIXEL_ALIGN이 됩니다. 예를 들어 가로 크기가 27일 때 나머지를 구하면 다음과 같습니다.
(27 * PIXEL_SIZE) % PIXEL_ALIGN (27 * 3) % 4 81 % 4 1
나머지는 1이 나왔습니다. 여기서 남는 공간을 구하려면 배수 4에서 1을 빼면 됩니다.
PIXEL_ALIGN - 1 4 - 1 3
따라서 남는 공간은 3이 됩니다. 만약 가로 크기가 20이라면 어떻게 될까요?
(20 * PIXEL_SIZE) % PIXEL_ALIGN (20 * 3) % 4 60 % 4 0
나머지가 0이 나왔습니다. 하지만 이렇게 되면 4에서 0을 뺐을 때 4가 나오므로 남는 공간이 0이 아닌 4가 되어버립니다. 잘못된 값이죠.
PIXEL_ALIGN - 0 4 - 0 4 // 남는 공간이 잘못된 값이 나옴
따라서 나머지가 0일 때를 대비해서 PIXEL_ALIGN - 나머지 값을 다시 한번 PIXEL_ALIGN으로 나머지 연산을 해줍니다.
(PIXEL_ALIGN - 0) % PIXEL_ALIGN (4 - 0) % 4 4 % 4 0 // 나누어 떨어지므로 나머지는 0
이제 최종 남는 공간이 0이 나왔습니다. 만약 PIXEL_ALIGN - 나머지가 PIXEL_ALIGN - 1이라 하더라도 3 % 4가 되므로 3을 그대로 구할 수 있습니다.
(PIXEL_ALIGN - 1) % PIXEL_ALIGN (4 - 1) % 4 3 % 4 3 // 3은 4로 나누어지지 않고(몫은 0), 3이 남음
이 부분을 전체 하나의 코드로 작성한 것입니다.
본문을 반복해서 읽고 이해하는 게 필요합니다.
이 부분은 C 언어 코딩보다는 비트맵 파일 처리에 대한 부분이므로
가볍게 넘어가도 됩니다.
이와 같은 연산 기법은 대수학(Algebra)에서 다뤄지며, 이를 코드로 다룬 전문적인 책은 <해커의 기쁨>이 있습니다.
http://www.yes24.com/Product/Goods/9218103?scode=032&OzSrank=2
비트맵에서 패딩 바이트를 구하는 부분은 숫자를 넣어서 하나씩 계산해보고, 표로 만들어서 이해하는 게 더 쉽습니다.