#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);
}
비트를 줄이니깐 흑백으로 나오네....ㅜㅜ
이거 색상을 컬러로 바꿀수는 없을까요?ㅠ
너 전에 질문했던 애지? 빨렛을 그레이로 만들었으니 당연히 흑백으로 나오지. 그런데 R G B 에 곱해준 비도 웃긴다 이런 그레이 첨보네 ㅡㅡㅋㅋ
예ㅠㅠ 제가 전에도 말했던거 같은데 뉴비라서 ㅠ 마니마니 부족해요.ㅠㅠ 칼라로 나오게 하려면 소스코드를 떻게 해야 될까요..?ㅠ