최근 업무를 진행하다가 아래 코드에서 혼선이 생겼다.
xxBitmap::getRawBitmapSize() {
return m_RawBitmap->getRawBitmapLength();
}
여기서 말하는 비트맵은 무엇일까? 픽셀(색상)을 갖고 있는 지도(MAP)에 의미를 하는 것일까? 비트맵의 사전적인 의미를 찾아보면 아래와 같다.
BMP라는 불리는 파일은 비트맵 파일 헤더(FileHeader) 와 비트맵인 포해서(InfoHeader) 두개로 구성된다. BITMAPFILEHEADER의 bfSize 실제 물리적인 크기를 갖고 있고 BITMAPINFOHEADER의 biSizeImage는 widthstep(stride, scanline) * 세로 사이즈의 실제 픽셀 데이터의 크기의 정보를 갖고 있다.
* 4바이트 Align 기준으로 계산한다고 가정
픽셀당 바이트 수 = 3
가로 = 640
세로 = 480
패딩 영역 = 가로 + (가로 % 4 ? 4 - 가로 % 4 : 0)
Widthstep = 가로 * 픽셀당 바이트 수 + 패딩 영역
biSizeImage = widthstep * 세로
typedef struct tagBITMAPFILEHEADER {
WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
} BITMAPFILEHEADER, *PBITMAPFILEHEADER;
typedef struct tagBITMAPINFOHEADER {
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
} BITMAPINFOHEADER, *PBITMAPINFOHEADER
왜 이렇게 계산하는지에 대해서는 다음 포스팅에 해야겠다. 컨벤션 관련 포스팅이었는데 갑자기 비트맵 이야기를 하니 계속 쓰게 되네... 아무튼 다시 컨벤션 이야기로 돌아간다.
대략적인 class xxRawBitmap 과 xxBitmap 코드가 이렇게 생겼다.
class xxRawBitmap {
...
public:
int getRawBitmapLength() {
return length;
};
private:
int length; // 파일의 크기
...
};
//blah blah
class xxBitmap {
...
public:
int getRawBitmapSize() const {
return m_RawBitmap->getRawBitmapLength();
}
private:
xxRawBitmap* m_RawBitmap;
...
}
최초 설계 의도는 RawBitmapData = 원시 비트맵 데이터라는 의미로 파일이란 의미로 추측했다. 실무에서 업무를 진행하면서 내가 만든 코드 보다 이미 설계되어 있는 코드를 그대로 사용하는 경우가 많아서 그냥 관례적으로 이해하고 넘어갔다. 하지만 많은 사람들이 물어보는 질문 중 하나였다.
많은 질문과 문의가 있다면 그건 분명 문제가 있다고 판단하여 나는 네이밍을 변경하였다. 실제 파일을 비트맵으로 변환하기 전 JPEG, PNG, TIFF, GIF 등의 경우 원시 데이터이므로 해당 class 이름을 Bitmap 이란 단어를 제거하여 xxRawBitmapData -> xxRawData로 변경하였다.
데이터 자료(資料, data, 데이터, 문화어: 데타)는 문자, 숫자, 소리, 그림, 영상, 단어 등의 형태로 된 의미 단위이다. 보통 연구나 조사 등의 바탕이 되는 재료를 말하며, 자료를 의미 있게 정리하면 정보가 된다.
자료(Data) : 현실 세계에서 관찰이나 측정을 통해 수집한 단순한 사실이나 결괏값으로 가공되지 않은 상태를 말한다. 정보(Information) : 의사 결정에 도움을 줄 수 있는 유용한 형태로, 자료를 가공(처리) 해서 얻을 수 있는 결과이다.
자료와 정보의 차이를 기반으로 RawBitmap 과 Bitmap에 대해서 네이밍을 수정하였다. 자료(RawData)를 화면에 표시할 수 있도록 가공한 정보(Bitmap)로 의미를 부여했다. 모든 사람들이 같은 의견이라고 생각하지는 않는다.
인터넷이랑 책에 있는 비트맵 구조를 그대로 인용했는데... 일반적이라는 말이 모호하다. 나중에 기회 되면 BMP Version1부터 5까지 BMP의 역사를 포스팅해야겠다.
RAII idiom (0) | 2021.05.07 |
---|---|
핌플 이디엄 Pimpl idiom (0) | 2021.05.07 |
싱글턴 패턴 SingleTon pattern (0) | 2021.05.07 |
빌더 패턴 사용 이유 (0) | 2021.05.07 |
빌더 패턴 Build pattern (0) | 2021.05.07 |
댓글 영역