본문 바로가기

컴퓨터 과학 & 영상처리 관련/영상처리

gray 파일 BMP 저장 시 컬러로 출력 될 시

#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이니깐 거기서부터 봐라