#include <stdlib.h>
#include <stdio.h>
#include <windows.h>
int main(void)
{
BITMAPFILEHEADER filehead;
BITMAPINFOHEADER infohead;
RGBQUAD pallete[256];
int width = 256, height = 256;
filehead.bfType = 0x4D42;
filehead.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * 256;
filehead.bfReserved1 = 0;
filehead.bfReserved2 = 0;
filehead.bfSize = filehead.bfOffBits + width * height;
infohead.biBitCount =8;
infohead.biClrImportant = 0;
infohead.biClrUsed = 0;
infohead.biCompression = 0 ;
infohead.biHeight = height;
infohead.biPlanes = 1;
infohead.biSize = 40;
infohead.biSizeImage = sizeof(BITMAPFILEHEADER) +
sizeof(BITMAPINFOHEADER) +
sizeof(RGBQUAD) * 256 +
width * height;
infohead.biWidth = width;
infohead.biXPelsPerMeter = 0;
infohead.biYPelsPerMeter = 0;
for(int i = 0 ; i < 256 ; i++)
{
pallete[i].rgbBlue = 0;
pallete[i].rgbGreen = i;
pallete[i].rgbRed = i;
pallete[i].rgbReserved = i;
}
BYTE* img = new BYTE[width * height ];
for(int i = 0 ; i < height ; i++)
{
for(int j = 0 ; j < width ;j++)
{
img[i*width + j] = i;
}
}
FILE* fp = fopen("test.bmp", "w");
fwrite(&filehead, sizeof(char), sizeof(BITMAPFILEHEADER) , fp);
fwrite(&infohead, sizeof(char) , sizeof(BITMAPINFOHEADER), fp);
fwrite(pallete, sizeof(RGBQUAD), 256, fp);
fwrite(img, sizeof(unsigned char), width * height, fp);
fclose(fp);
delete[] img;
return 0;
}
pallete에서 rgbBlue가 reserved 랑 바뀌어서 값을 입력되어야지 알씨, 포토샵, 그림판에서 gray로 보임
헤더는 windows.h
이게 mfc에서 돌아갈 때는 잘 되더만 왜 요지랄이지
BYTE to BMP의 경우 아래부터 0,1,2,3,4 행임
왼쪽부터 0,1,2,3,4 열임
아예 맨처음 0,1,2 픽셀은 255,255,0으로 되어있고..그 다음부터 픽셀값이 들어가
게 되어있어...
헥스 에디트로 검증 중에 보니깐 offset이 5c 부분에 0a 0a 0a 00 이 올 차례인데
0d 0a 0d 0a가 왔음..그러고 0d 0a 00이 옴...그러니깐 0d가 3번 ..3 byte 잡음이
들어가 있는데..이건 무슨 씨발 팔레트 만들때는 for문으로 만들었는데 이 잡음은
왠거냐?
그리고 0436부터 시작인데..이게 잡음이 들어가서 나오게 됨...앞에는 팔레트가 잠
식하고..뒤에틑 2~3바이트 짤리고..
어쨌든 그건 fopen시 wb로 안해서 그런거였음...그래서 팔레트도 좆같이 되고 그런
거임...포토샵에서 2바이트 추가되고 뭐 그런거는 팔레트 엿같이 되는거랑은 큰 상
관없으니깐 파일 사이즈 문제이므로 걍 넘어가자
파일헤더 보는 법...요 순서대로...0x4D42는 아래와 저장되어 있음...
bftype, bfsize, bfreserved1, bfreserved 2, bfoffbits
bftype = 0x4d42가 42 4d로 저장됨...뒤부터 읽으면 됨
bfsize = 66614
bfreserved1
bfreserved2
bfoffbits = 00 00 04 36 = 1078
이미지 헤더 보는 법
bfsize
biwidth
biheight
biplane
bibitcount
bicompression
bisizeimage
bixpelspermeter
biypelspermeter
biclrused
biclrimportant
팔레트 정상일 경우 ("wb"로 작성 시)
bfsize = 00 00 00 28 = 40
biwidth = 01 00 = 256
biheight = 01 00 = 256
biplane = 1
bibitcount = 8
bicompression
bisizeimage
bixpelspermeter
biypelspermeter
biclrused
biclrimportant
여기가...팔레트냐? 54니깐 - 36부터 시작임...00 00 00 00 이니깐 맞네...
1078은 436이니깐 거기서부터 봐라
'컴퓨터 과학 & 영상처리 관련 > 영상처리' 카테고리의 다른 글
픽셀 값 정규화? normalization? (0) | 2014.02.10 |
---|---|
RGB 코드? #ffffff 이렇게 표현하는거 (0) | 2014.02.02 |
BYTE image 90도 rotate 함수 (0) | 2013.09.27 |
픽셀값이 음수일 경우 양수로 바꾸는 방법 (0) | 2013.09.09 |
bmp파일 열기. 저장하기 (0) | 2013.09.09 |