형들아 내가 24비트 BMP 사진을 8비트 사진으로 줄여서 VISUALC++에서 텍스트모드로 구현을 해서 구현된 사진을 페인트샾을 통해서 확인 하는 프로그램을 C언어로 짜고 있는데 파일을 열고 파일헤드 및 영상헤드 를 읽었어 그리고 PALETTE생성해서 24비트를 8비트로 줄여야 되는데 어떻게 PALETTE생성 해야 될지 모르겠어. ㅠㅠ 여기저기 알아 보고 있는데 답을 주는데가 없어서 혹시나 하는 맘에 물어 봐 ㅠ 밑에는 내가 여태까지 짠 소스고 여기서 어떻게 팔레트를 생성 해야될지 좀 알려줘...ㅠ
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<Windows.h>
#define BYTE unsigned char
#define WIDTHBYTES(bits) ((bits)+31/32*4)
void main()
{
FILE *infile;
infile = fopen("ci24", "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(8 * hInfo.biWidth);
BYTE *lpOutImg = new BYTE[3 * rwsize2*hInfo.biHeight];
RGBQUAD *pRGB = NULL;
if (hInfo.biClrUsed != 0)
{
pRGB = new RGBQUAD[hInfo.biClrUsed];
fread(pRGB, sizeof(RGBQUAD), hInfo.biClrUsed, infile);
}
}
니가 하려고 하는 작업은 1680만색의 팔레트를 256색 팔레트로 바꾸려고 하는거다.
RGB 각각 8비트씩 단계가 나뉘어져 있는걸 2비트 3비트 2비트 나 3비트 3비트 2비트 단위로 쪼개보면 지저분한 결과가 나오지
그래서 8비트 이미지 전환엔 흔히 통계적 대표색상 선택을 한다. 그런 대표적인 예가 GIF 라이브러리들 (8비트 이미지 전용임) 이고
근데 넌 파일을 닫아놓고 팔레트를 읽으려고 하네
24비트 이미지에서 팔레트를 읽겠다는 자체가 넌센스
팔레트는 니가 직접 색상을 만들어 넣어야 하는거야. 그리고 원본 영상에서 가장 색상이 가까운 팔레트의 인덱스 값을 이미지 영역에 넣어야지
그레이 스케일 빨레트면 계산이 간단하지만, 그게 아니라면 유클리드 거리가 가장 가까운놈을 고르면 돼
개념을 익히기 싫으면 라이브러리를 갖다 써라
libPNG 같은것도 좋음 png도 8비트 지원하니까
음... 대략 무슨 말인지 알겠는데 그래서 어떻게 팔레트를 구체적으로 생성 해야 될지 모르겠어...ㅠㅠ 영상처리도 못하고 프로그래밍 언어도 못해서그런데 팔레트 소스를 어떻게 구현하면 되는지 알려주면 안될까?ㅠ 아님 참고 서적이라도 좀알려줘...ㅠ
그러니깐 .. 대략적으로 순서도로 표현하면 파일헤드 -> 영상 헤드-> 데이터 할당 -> 팔레트(24bit->8bit) -> 역상 -> 출력 이런 식으로 해야 되는건가??