#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>


#pragma pack(1) // 1바이트 단위로 저장


struct BITMAPFILEHEADER //파일 헤더를 BITMAPFILEHEADER 라는 이름으로 구조체로 정의


{
 unsigned short bfType;  //'BM'이라는 값을 저장함
    unsigned int bfSize;    // 바이트 단위로 전체파일 크기
    unsigned short bfReserved1; // 예약된 변수
    unsigned short bfReserved2; // 예약된 변수
    unsigned int bfOffBits; //데이터 파일 시작 위치


};


struct BITMAPINFOHEADER //이미지 헤더를 BITMAPINFOHEADER 라는 이름으로 구조체로 정의


{
    unsigned int biSize; // 이구조체의 크기
    int biiWidth;        // 픽셀단위로 영상의폭
    int biHeight;        // 영상의 높이
 unsigned short biPlanes;   // 비트 플레인 수(항상1)
    unsigned short biBitCount; // 픽셀 당 비트 수(컬러, 흑백구별)
    unsigned int biCompression;// 압축유무
    unsigned int biSizeImage;  // 영상의 크기(바이트 단위)
    int biXPelsPerMeter;       // 가로해상도
    int biYpelsperMeter;       // 세로해상도
    unsigned int biClrUsed;    // 실제 사용한 색상 수
    unsigned int biClrImortant;// 주요한 색상 인덱스
};


struct RGBQUAD  // 인덱스에 의한 컬러값 저장을 위한 팔레트 구조체


{
 unsigned char rgbBlue;      // B성분(파랑색)
 unsigned char rgbGreen;     // G성분(녹색)
 unsigned char rgbRed;       // R성분(빨강색)
 unsigned char rgbReserved;  // 예약된 변수


};


struct BITMAPFILEHEADER bf_header; // BITMAPFILEHEADER형 변수 bf_header선언
struct BITMAPINFOHEADER bi_header; // BITMAPINFOHEADER형 변수 bi_header선언
struct RGBQUAD bmp_pal[256];       // 비트맵 팔레트


int main()


{
    FILE *fbmp, *fbalance; // File형 포인터변수 *fbmp, *fred선언
    int i;              // int형 변수 i 선언
    unsigned char *bmp, *balance; //  char형 포인터변수 *bmp, *balance선언
    unsigned char  red, green, blue; // char형 변수 red, green, blue 선언
    fbmp = fopen("pshop.bmp", "rb"); // 입력할 파일을 오픈


 fread(&bf_header, sizeof(bf_header), 1, fbmp); // 변수 bf_header 를 파일에서 읽음
 fread(&bi_header, sizeof(bi_header), 1, fbmp); // 변수 bi_header 를 파일에서 읽음


    bmp = (unsigned char*)malloc(sizeof(unsigned char) * 1440 * 151);          
    balance = (unsigned char*)malloc(sizeof(unsigned char) * 360 * 151);
 //동적으로 메모리 할당
    fread(bmp, sizeof(unsigned char), sizeof(unsigned char) * 1440 * 151, fbmp);
fclose(fbmp);




 


  for (i = 0; i < 360 * 151; i++)


  {


   blue = bmp[i * 3];


   green = bmp[i * 3 + 1];


   red = bmp[i * 3 + 2];


   balance[i] = 0.3126*red + 0.3152*green + 0.3722*blue;


  } //역상을 구해준다.?! 아닌가..ㅠ










 


 bf_header.bfOffBits += 1024; // 인포헤더 아래에 팔레트가 오므로 1024만큼 뒤에 비트맵 데이터 시작


 


 bi_header.biBitCount = 8; // 8비트 비트맵이므로 8로 수정





 for (i = 0; i < 256; i++)


 {


  bmp_pal[i].rgbBlue = i;


  bmp_pal[i].rgbGreen = i;


  bmp_pal[i].rgbRed = i;


  bmp_pal[i].rgbReserved = 0;


 }  // 팔레트 만들기


    fbalance = fopen("Out.bmp", "wb");
    fwrite(&bf_header, sizeof(bf_header), 1, fbalance);
    fwrite(&bi_header, sizeof(bi_header), 1, fbalance);
 //
 fwrite(bmp_pal, sizeof(bmp_pal), 1, fbalance);
 fwrite(balance, sizeof(unsigned char), 360 * 151, fbalance);
 // 팔레트를 저장
 fclose(fbalance);



}



비트를 줄이니깐 흑백으로 나오네....ㅜㅜ


이거 색상을 컬러로 바꿀수는 없을까요?ㅠ