|
wingdi.h 파일에 BITMAPFILEHEADER 선언을 보면 아래와 같습니다.
#include <pshpack2.h>
typedef struct tagBITMAPFILEHEADER {
WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
} BITMAPFILEHEADER, FAR *LPBITMAPFILEHEADER, *PBITMAPFILEHEADER;
#include <poppack.h>
구조체의 내용을 직접 size 계산해 보십시요
WORD 형이 3 개 , DWORD형이 2개 입니다.
그럼 SIZE = 2 * 3 + 4 * 2 = 6 + 8 = 14 , 14Byte 입니다.
그런데 프로그램에서 sizeof(BITMAPFILEHEADER) 해 보십시요
16 이 나올겁니다.
왜 16이 나올까요?
원래 32bit CPU 시스템에서 메모리할당을 32bit씩 합니다.
위와 같은 구조체를 그냥 sizeof하면 16byte가 나옵니다
이걸 14byte나오게 하기 위해서 1byte또는 2byte단위로 묶도록 설정해주는것이 필요합니다.
위 구조체에서도 2byte단위로 묶도록 #include <pshpack2.h> 이 문구가 앞에 있습니다.
그런데 잘안되네요 ==> 원인은 저도 잘 모릅니다.
---------------------------------------------------------
그래서 그 위 구조체를 그대로 복사해서 다른이름으로 선언해봣습니다.
#pragma pack(push,1) // 또는 #pragma pack(push,2) , 또는 #pragma pack(2)
typedef struct tagBITMAPFILEHEADER2 {
WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
} BITMAPFILEHEADER2;
#pragma pack(pop)
BITMAPFILEHEADER2 라는 이름으로
위에서 #pragma pack(push,1) 문구는 1byte씩 묶어라는 말입니다.
코드에서
int hsize=sizeof(BITMAPFILEHEADER);
int hsize2=sizeof(BITMAPFILEHEADER2);
해보십시요
hsize=16 이지만
hsize2 = 14 입니다.
재선언한 구조체를 이용해 보세요
#include <pshpack2.h> 이 왜 안먹히는지는 연구좀 해봐야....
그럼 즐플.....
빌더초짜 님이 쓰신 글 :
: 잘되던 소스를 빌더6에서 해봤는데 이상하게 저장됩니다.
: 폼위에는 버튼 하나 있고요 실행시키면 흰색으로 채워진 BMP를 저장합니다.
: 그런데 미리보기에도 안나와서 크기를 봤더니 64*64*24가 4194304*4194304*2로 나옵니다.
: 첨부화일에 저장된 bmp와 소스가 있고요 경험이 일천하여 아무리 봐도 모르겠습니다.
: 여러 고수님들의 도움을 부탁드립니다~
|