VISUAL C++통해서 24비트 트루 칼라를 8비트 칼라로 바꿔서 페인트샾으로 영상을 확인 하는 프로그램을 만들고 싶은데
일단 24비트 영상데이터를 잘 꺼냈고 파일헤드랑 영상정보헤드 구조체 변수 선언 함 다음에 구조체를 통해서 팔레트를 구현했는데
그다음에 어떻게 해서 팔레트를 통해서 24비트를 8비트로 줄여야 될지 모르겠어 ㅠ 밑에는 지금 까지 짠 소스인데 맞게 한거 같은데
틀린점이 있다면 지적좀 해주고 앞으로 어떻게 구성해야 8비트로 바꿀수 잇을지 소스 아니면 힌트좀 줘 형들 ㅠㅠ
#include<stdio.h>
#include<Windows.h>
#define BYTE unsigned char
#define WIDTHBYTES(bits) ((bits)+31/32*4)
typedef struct tagRGBQUAD{
BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRde;
BYTE rgbReserved1;
}RGBQUAD;
void main()
{
FILE *infile;
infile = fopen("ci.bmp", "rb");
if (infile == NULL){ printf("파일이 없습니다.\n"); return; };
BITMAPFILEHEADER hf;
fread(&hf, sizeof(BITMAPCOREHEADER), 1, infile);
if (hf.bfType != 0x4D42) exit(1);
BITMAPINFOHEADER hInfo;
fread(&hInfo, sizeof(BITMAPINFOHEADER), 1, infile);
if (hInfo.biBitCount < 8){ printf("좋지 못한 파일 형식!!"); return; }
BYTE *lpImg = new BYTE[hInfo.biSizeImage];
fread(lpImg, sizeof(char), hInfo.biSizeImage, infile);
fclose(infile);
int rwsize = WIDTHBYTES(hInfo.biBitCount*hInfo.biWidth);
int rwsize2 = WIDTHBYTES(24*hInfo.biWidth);
BYTE *lpOutImg = new BYTE[3 * rwsize2*hInfo.biHeight];
if (hInfo.biBitCount == 8)
if (hInfo.biClrUsed != 0)
{
RGBQUAD *pRGB;
pRGB = new RGBQUAD[hInfo.biClrUsed];
fread(pRGB, sizeof(RGBQUAD),hInfo.biClrUsed,infile);
}
}
대충 생각해 보면... 일단 팔레트가 총 256색일텐데 그냥 새로운 256색이 나올 때까지는 팔레트를 대충 다 채우고 256색이 넘어갈 경우 256 팔레트 내에서 가장 가까운 색을 찾아서 원래 있던 색이랑 새로운 색의 평균을 취해서 넣어두는 방식을 써봐.