1 / 7

New Operation Color Table Color Image Processing

03 장. 칼라 BMP 파일 구성. New Operation Color Table Color Image Processing. New. #include <stdio.h> void main() { int* p=new int; } 이름을 부여할 수 없다 자동으로 크기 부여 주소로만 접근가능. p. int. RGBQUAD. RGBQUAD. Example. #include <stdio.h> #include <windows.h>

leala
Download Presentation

New Operation Color Table Color Image Processing

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 03장 칼라 BMP파일 구성 • New Operation • Color Table • Color Image Processing

  2. New #include <stdio.h> void main() { int* p=new int; } • 이름을 부여할 수 없다 • 자동으로 크기 부여 • 주소로만 접근가능 • p • int

  3. RGBQUAD

  4. RGBQUAD

  5. Example #include <stdio.h> #include <windows.h> #define WIDTHBYTES(bits) (((bits)+31)/32*4) // 영상 가로길이는 4바이트의 배수여야 함 #define BYTE unsigned char void main() { FILE *infile; infile=fopen("pshop256.bmp", "rb"); if(infile==NULL) { printf("There is no file!!!\n"); exit(1); } BITMAPFILEHEADER hf; fread(&hf,sizeof(BITMAPFILEHEADER),1,infile); // 파일헤드를 읽음 if(hf.bfType!=0x4D42) exit(1); BITMAPINFOHEADER hInfo; fread(&hInfo,sizeof(BITMAPINFOHEADER),1,infile); // 영상헤드를 읽음 printf("Image Size: (%3dx%3d)\n",hInfo.biWidth,hInfo.biHeight); printf("Pallete Type: %dbit Colors\n",hInfo.biBitCount); // 256칼라 이하의 경우는 취급하지 않음 if(hInfo.biBitCount<8 ) { printf("Bad File format!!"); exit(1); } RGBQUAD *pRGB; if(hInfo.biClrUsed!=0) // 팔레트가 있는 경우 { pRGB= new RGBQUAD [hInfo.biClrUsed]; // 팔레트의 크기만큼 메모리를 할당함 fread(pRGB,sizeof(RGBQUAD),hInfo.biClrUsed,infile); // 팔레트를 파일에서 읽음 } // 영상데이타를 저장할 메모리 할당 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*rwsize*hInfo.biHeight]; int index, R, G, B, i,j; if(hInfo.biBitCount==24) // 만일 입력영상이 트루(24비트) 칼라인 경우 for(i=0; i<hInfo.biHeight; i++) { for(j=0; j<hInfo.biWidth; j++) { // 팔레트가 없으므로 영상데이타가 바로 칼라값 lpOutImg[i*rwsize2+3*j+2] = 255-lpImg[i*rwsize+3*j+2]; lpOutImg[i*rwsize2+3*j+1] = 255-lpImg[i*rwsize+3*j+1]; lpOutImg[i*rwsize2+3*j ] = 255-lpImg[i*rwsize+3*j ]; } } else // 트루칼라가 아닌 경우 for(i=0; i<hInfo.biHeight; i++) { for(j=0; j<hInfo.biWidth; j++) { index = lpImg[i*rwsize+j]; // 영상데이타는 팔레트의 인덱스임 R = pRGB[index].rgbRed; // 팔레트에서 실제 영상데이타를 가져옴(R) G = pRGB[index].rgbGreen; // G B = pRGB[index].rgbBlue; // B R = 255-R; G = 255-G; B = 255-B; // 역상을 계산함 lpOutImg[i*rwsize2+3*j+2] = (BYTE)R; lpOutImg[i*rwsize2+3*j+1] = (BYTE)G; lpOutImg[i*rwsize2+3*j ] = (BYTE)B; } } // 영상 출력 (24비트인 트루칼라로 출력) hInfo.biBitCount =24; hInfo.biSizeImage = 3*rwsize*hInfo.biHeight; hInfo.biClrUsed = hInfo.biClrImportant =0; hf.bfOffBits = 54; // 팔레트가 없으므로 값이 변함 hf.bfSize = hf.bfOffBits+hInfo.biSizeImage; FILE *outfile = fopen("OutImg24.bmp","wb"); fwrite(&hf,sizeof(char),sizeof(BITMAPFILEHEADER),outfile); fwrite(&hInfo,sizeof(char),sizeof(BITMAPINFOHEADER),outfile); fwrite(lpOutImg,sizeof(char),3*rwsize*hInfo.biHeight,outfile); fclose(outfile); // 메모리 해제 if(hInfo.biClrUsed!=0) delete []pRGB; delete []lpOutImg; delete []lpImg; }

  6. Excise 1. MFC 파일구조 이해 2. MFC에서 BMP File 읽어오기 3. MFC 함수 추가

More Related