티스토리 뷰
안녕하세요!
오늘은 BMP파일에 대해서 알아보겠습니다.
●BMP파일이란?
비트맵(Bitmap) 이미지 파일 형식으로, 특히 windows 환경에서 많이 사용하는 이미지 형식입니다.
BMP파일은 각 픽셀의 색상 정보를 직접적으로 저장하므로, 고해상도 이미지를 그대로 표현할 수 있어 품질이 좋습니다.
하지만 파일의 크기는 클 수도 있어요.
저희는 지금까지 raw파일을 이용했지만, bmp파일도 이용해 보려요 해요.
(컬러)raw파일의 경우
왼쪽 상단부터 ( R, G, B ) 순서로 우측으로 1byte씩 메모리가 할당되어 총 3byte가 하나의 픽셀을 결정하지만
(컬러)bmp파일의 경우
왼쪽 하단부터 ( B, G, R ) 순서로 우측으로 1byte씩 메모리가 할당되어 총 3byte가 하나의 픽셀을 결정합니다.
또한,
raw파일은 픽셀 데이터만 저장되지만,
bmp파일은 픽셀 데이터와 파일의 정보도 같이 저장되어 있습니다.
raw파일 데이터공간 : [ 픽셀 데이터 ]
bmp파일 데이터공간 : [ 파일헤더 + 정보헤더 + 픽셀 데이터 ] 으로 이루어져있습니다.
사실 bmp파일은 색상 테이블 데이터를 저장하는 공간이 하나더 존재하는데요.
1, 4, 8 비트 bmp에서만 사용됩니다!
앞으로 저희가 다루는 것은 24비트이기 때문에 색상 테이블 공간은 생각하지 않겠습니다.
그러면 bmp파일의 헤더 부분에 대해 알아보겠습니다.
#pragma pack(push, 1) // 구조체 패딩을 제거하기 위해 1바이트 정렬 사용
struct BITMAPFILEHEADER {
unsigned short bfType; // BMP 파일 넘버 (0x4D42)
unsigned int bfSize; // 파일의 전체 크기
unsigned short bfReserved1; // 예약된 필드 (0)
unsigned short bfReserved2; // 예약된 필드 (0)
unsigned int bfOffBits; // 실제 이미지 데이터의 시작 위치
}
struct BITMAPINFOHEADER {
unsigned int biSize; // BITMAPINFOHEADER의 크기
int biWidth; // 이미지의 너비 (픽셀 단위)
int biHeight; // 이미지의 높이 (픽셀 단위)
unsigned short biPlanes; // 색상 평면 수 (항상 1)
unsigned short biBitCount; // 픽셀당 비트 수 (색상 깊이)
unsigned int biCompression; // 압축 방식
unsigned int biSizeImage; // 이미지 데이터 크기
int biXPelsPerMeter; // 가로 해상도 (미터당 픽셀 수)
int biYPelsPerMeter; // 세로 해상도 (미터당 픽셀 수)
unsigned int biClrUsed; // 실제 사용된 색상 수
unsigned int biClrImportant; // 중요한 색상 수
}
#pragma pack(pop) // 패딩을 원래 상태로 되돌림
BITMAPFILEHEADER : 총 14byte
bmp파일의 정보를 담고있는 헤더입니다.
● bfType : 2byte
파일의 형식 넘버를 나타냅니다 bmp파일의 경우 0x4D42입니다.
● bfSize : 4byte
파일의 전체 크기입니다. 헤더부분과 픽셀부분 다 합친 크기와 같습니다.
● bfReserved1,2 : 2byte
예약된 공간입니다. 추후에 추가할내용이 있을수도있어 만들어놓은 필드입니다.
지금은 사용하지않으므로 0입니다.
● bfOffBits : 4byte
실제 이미지 데이터의 시작위치를 나타냅니다.
BITMAPINFOHEADER : 총 40byte
bmp파일의 이미지부분의 정보를 담고있는 헤더입니다.
● biSize : 4byte
sizeof(BITMAPINFOHEADER)의 값을 갖습니다. 기본적으로는 40 입니다.
● biWidth : 4byte
픽셀을 단위로 했을때 이미지의 너비를 나타냅니다.
● biHeight : 4byte
픽셀을 단위로 했을때 이미지의 높이를 나타냅니다.
● biPlanes : 2byte
사용하는 색상평면의 개수. 1으로 고정입니다.
● biBitCount : 2byte
픽셀당 비트수를 나타내는 필드입니다.
1비트: 흑백
4비트: 16 가지 색상
8비트: 256 가지 색상
16비트: 65,536 가지 색상
24비트: 16,777,216 가지 색상 -> 고화질 컬러 사진에 주로 사용
32비트: 24비트 + 투명도채널( 8비트) -> 투명도를 나타낼 때 사용
● biCompression : 4byte
이미지 데이터의 압축 방식을 나타내는 필드입니다.
0 : 압축이 없는 형식
1 : 8비트 RLE 압축 방식으로 biBitCount가 8일 때 사용됩니다.
2 : 4비트 RLE 압축 방식으로 biBitCount가 4일 때 사용됩니다.
3 : RGB 각각의 채널에 사용자 정의 마스크를 지정하는 방식입니다.
4: 이미지 데이터를 JPEG 압축으로 저장합니다.
5: 이미지 데이터를 PNG 압축으로 저장합니다.
● biSizeImage : 4byte
픽셀의 개수가 아니라 픽셀들이 전체적으로 차지하는 바이트수를 나타내는 필드 입니다.
이미지가 흑백인경우
하나의 픽셀당 1byte이므로 biWidth * biHeight = biSizeImage 이지만
이미지가 컬러인 경우(24비트)
R,G,B 각각 1byte의 크기를 가져 하나의 픽셀을 구성하므로 biWidth * biHeight * 3 = biSizeImage 입니다.
● biXPelsPerMeter, biYPelsPerMeter : 각각 4byte
이미지의 수평, 수직 해상도를 나타내는 필드입니다.
이미지의 물리적인 해상도를 나타내기 위해 사용됩니다.
●biClrUsed : 4byte
bmp파일에서 사용된 색상 수를 나타내는 필드입니다. ( 1, 4, 8 비트 BMP파일에서 주로 사용됨 )
● biClrImportant : 4byte
bmp파일에서 이미지를 표시하는 데 있어 중요한 색상의 수를 나타내는 필드입니다.
그럼 이제 BMP파일을 뜯어보겠습니다!
위의 그림과 같은 데이터 공간으로 이루어져있습니다.
BMP파일(24비트)의 메모리 공간은 BITMAPFILEHEADER + BITMAPINFOHEADER + 픽셀데이터
으로 이루어져있는걸 생각하면서 보시면.
각각의 byte를 생각하시면서 확인해 보면,
빨간부분은 BITMAPFILEHEADER를 나타내는 부분
처음부분 부터 차례대로 bfType, bfSize ...를 나타냅니다.
파란부분은 BITMAPINFOHEADER를 나타내는 부분
처음부분 부터 차례대로 biSize, biWidth ...를 나타냅니다
초록부분은 Pixel data를 나타내는 부분임을 알수있습니다!
왼쪽 하단부터 B G R 로 저장되는 것이기때문에
( B = 38, G = 15, R = 55 ) => 어두운 보라색계열이 이미지의 제일 왼쪽하단에 위치하게됩니다.
위의 내용을 알아두셔야
다음 글에서 할, raw파일을 bmp파일로 바꾸는 방법에대해 쉽게 이해하실수 있습니다 !
감사합니다.
'C언어' 카테고리의 다른 글
[C언어] 3-2. raw파일을 bmp파일로 변환하기 (0) | 2024.11.11 |
---|---|
[C언어] 3-1. bmp파일을 raw파일로 변환하기 (4) | 2024.11.10 |
[C언어] 2.기본적인 영상처리(2) (3) | 2024.11.08 |
[C언어] 1. raw파일 복사하는 방법 (7) | 2024.11.07 |
[C언어] 2.기본적인 영상처리(1) (0) | 2024.11.07 |
- Total
- Today
- Yesterday
- activationfunction
- sungroup
- cyclicgroup
- errorcorrecting
- errordetecting
- bmptoraw
- bmp헤더
- rawtobmp
- MLP
- 정보전송
- RAW
- BMP
- raw회전이동
- 편향
- bias
- 티스토리챌린지
- 의류분류
- 신경망딥러닝
- 다층퍼셉트론
- 오블완
- 활성화함수
- 퍼셉트론
- 현대대수학
- perceptron
- 회전이동
- 영상처리 #기초
- generator
- fashionMNIST
- DEEPLEARNING
- klein4group
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |