코드 소스 오픈 (5) - 컬러 bmp 그림 그레이스케일

다음 프로그램은 컬러 bmp 형식의 그림을 그레이스케일로 변환할 수 있습니다.
#include <iostream.h>
#include <windows.h>
#include <stdio.h>

/*BMP      :
㈠BITMAPFILEHEADER:     (   BMP  )
				  bfType="BM"
				  bfSize
				  bfReserved1
				  bfReserved2
				  bfOffBits                    ,          
㈡BITMAPINFOHEADER:     
                  biSize            , 40   
				  biWidth         ,     
				  biHeight        ,     
				  biPlanes
				  biBitCount
				  biCompression
				  biSizeImage                 biSizeImage=biWidth_*biHeight,  biWidth   4    
				                biCompression BI_RGB,      0
				  biXPelsPerMeter
				  biYPelsPerMeter
				  biClrUsed
				  biClrImportant
㈢Palette         :   
                                ,          
㈣DIB Pixels      :    
*/

BITMAPFILEHEADER bf;  //   
BITMAPINFOHEADER bi;  //   
RGBQUAD  *palette=NULL;     //   

BYTE   *m_imagedata=NULL;   //      
BYTE   *m_outputdata=NULL;  //      
int     m_ImageWidth;   //    
int     m_ImageHeight;  //    

void main()
{
	FILE  *fp1,*fp2;  //    ,fp1    ,fp2        

	//    ,     
	if((fp1=fopen("test.bmp","rb"))==NULL)
	{
		MessageBox(NULL,"      ","warning",MB_OK);
	}

	fread((LPSTR)&bf,sizeof(BITMAPFILEHEADER),1,fp1);  //     ,              (    )

	//               
	int temp=bf.bfType;          //                
	cout<<"BM  :"<<(char *)(&temp)<<'
'; cout<<" :"<<bf.bfOffBits<<'
'; fread((LPSTR)&bi,sizeof(BITMAPINFOHEADER),1,fp1); // // cout<<" :"<<bi.biWidth<<'
'; cout<<" :"<<bi.biHeight<<'
'; m_ImageWidth=bi.biWidth; // m_ImageHeight=bi.biHeight; // // 4 , , while(m_ImageWidth%4!=0) // 4 m_ImageWidth++; // palette=(RGBQUAD *)new BYTE[bf.bfOffBits-sizeof(BITMAPFILEHEADER)-sizeof(BITMAPINFOHEADER)]; fread(palette,bf.bfOffBits-sizeof(BITMAPFILEHEADER)-sizeof(BITMAPINFOHEADER),1,fp1); m_imagedata= new BYTE[m_ImageHeight*m_ImageWidth*3]; // fread(m_imagedata,m_ImageHeight*m_ImageWidth*3,1,fp1); // // 0 , , ....... // m_outputdata= new BYTE[m_ImageHeight*m_ImageWidth*3]; // // m_imagedata , m_outputdata // , , , // copy , for(int i=0;i<m_ImageHeight;i++) { for(int j=0;j<m_ImageWidth*3;j=j+3) { int k=m_ImageWidth*i*3+j; int gray=(int)(0.3*m_imagedata[k]+0.59*m_imagedata[k+1]+0.11*m_imagedata[k+2]); m_outputdata[k]=m_outputdata[k+1]=m_outputdata[k+2]=gray; } } // if((fp2=fopen("result.bmp","wb"))==NULL) { MessageBox(NULL," ","warning",MB_OK); } // , test fwrite((LPSTR)&bf,sizeof(BITMAPFILEHEADER),1,fp2); fwrite((LPSTR)&bi,sizeof(BITMAPINFOHEADER),1,fp2); fwrite(palette,bf.bfOffBits-sizeof(BITMAPFILEHEADER)-sizeof(BITMAPINFOHEADER),1,fp2); fwrite(m_outputdata,m_ImageHeight*m_ImageWidth*3,1,fp2); // fclose(fp1); // fclose(fp2); }

좋은 웹페이지 즐겨찾기