Admin | Write | GuestBook
[공지] 해당 블로그에 용건이 있으신 분께서는 http://blog.fore.kr/ 의 방명록(Guestbook)으로 부탁드립니다.
BMP 파일 구조에 대한 고찰.
Category : Programming/Programming Talk | URL : | Written by 포레 ( 2014. 11. 11. 14:23 ) | 신고

 

설명에 앞서, BMP 옵션 BI_RGB 을 전제로 설명합니다.

 

프로그램 만들던 중 기존에 있던 프로그램에 문제가 있길래

 

30분 동안 삽질해서 알아냈다 -_- . . .

 

일반적인 BMP 파일 구조는 크게

 

BITMAP FILE HEADER 

 BITMAP INFO HEADER

 BITMAP COLOR

 

위와 같이 구성되어 있다.

 

자세한 구조는

BITMAP FILE HEADER 는 http://msdn.microsoft.com/en-us/library/dd183374(v=vs.85).aspx

BITMAP INFO HEADER 는 http://msdn.microsoft.com/en-us/library/dd183376(v=vs.85).aspx

를 참고바람.

 

아무튼, 24bit 비트맵 파일의 경우 BITMAP COLOR 에는 3바이트씩(RGB)

 

32bit의 경우에는 4바이트씩(ARGB)으로 들어간다라고만 막연히 지내온게 4년 . . .

 

여기서 문제가 발생되었다 -_- . . .

 

가로 850px 짜리 이미지를 만들고 BITMAP COLOR에 3바이트씩 850번 넣고 저장하니

 

저장되질 않는다. (...)

 

이럴 때 찾아보는 위키 !

( 한국 위키는 쓰레기라 가능하면 타언어로 보는걸 추천합니다.

딴건 모르겠는데 특히 프로그래밍 관련은 개쓰레기... )

 

http://en.wikipedia.org/wiki/BMP_file_format

 

여기서 'Pixel storage' 부분을 보면

 

 

이런 작고 아름다운 공식을 볼 수 있다.

 

기존의 지식으로 계산해보면

ImageWidth = 850

BitsPerPixel = 24 (3)

라고 봤을 때 계산하면

 

850 x 3 = 2550 이 들어가는데

 

위 공식을 대입했을 경우

 

((24 x 850 + 31)/32)*4 = 2552

 

이 경우 나눗셈 할 시 소수점에 대해선 무조건 내림처리 해야하며

 

32 나누고 4 곱하니까 8로 나누면 되지 않느냐 라는 부분에 대해선

 

내림처리로 인해 값이 달라지므로 반드시 나눈 후 곱셈을 하는 계산해야 한다.

 

이렇게 되면 2552 와 2550 의 사이에 2 라는 값이 차이가 나게 된다.

 

이 2 라는 값은 padding에 속하는데 해당 위키의 'Example 1' 항목의 구조에서

 

이런식으로 확인할 수 있다.

 

따라서, 해당 비트맵의 Width 끝나는 시점에 공식에 의한 비트수와 기존의 비트수를 빼서 값이 남으면

 

그 값만큼 padding을 넣어줘야만 제대로된 비트맵 파일을 볼 수 있게 된다.

 

결론은 여기까지고, 추가로 padding 된 바이트도 bitmap 파일 구조에 비트수가 표현되는 부분(두 부분)이 있는데

 

이 부분의 값 또한 padding 값에 맞춰서 재계산해 줄 필요가 있다.

 

[ PADDING 을 넣은 올바른 예 ]

 

[ PADDING 을 잘못 넣은 예 ]

 

Category
분류 전체보기 (605)
Notice (6)
Programming (79)
DISKER (1)
FSCH (7)
Caption (0)
Rest Time ! (443)
Hobby (64)
Tour (5)
Blind Post (0)
Recent Post
Recent Comment
Link
Calender
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Total :
Today :
Yesterday :