| 
 | 
 
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册  
 
x
 
void CRGB2GRAYDlg::OnBtSelect()  
{ 
        // TODO: Add your control notification handler code here 
        int i,j; 
        int skip=0;//补齐宽度 
        CFile file_s; 
        CFile file_d; 
        CString path; 
        BYTE* rgbdata; 
        BYTE* graydata; 
 
        int W,H; 
         
        CFileDialog fdlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,  
                "Bmp files(*.bmp)|*.bmp||",NULL); 
        //CFileDialog fdlg(TRUE,NULL,OFN_HIDEREADONLY,"BMP Files(*.bmp)|*.bmp||",NULL); 
        BITMAPFILEHEADER bmpfh; 
        BITMAPINFOHEADER bmpih; 
        int resp = fdlg.DoModal();//弹出一个对对话框 
        switch (resp) 
        { 
        case -1: 
                return; 
        case IDOK://确定或者ok按钮 
                path = fdlg.GetPathName();        //路径名         
                break; 
        case IDCANCEL: 
                return; 
        } 
 
        if(file_s.Open(path,CFile::modeRead|CFile::shareDenyNone)) 
        { 
                //文件打开成功,开始读取数据 
                //文件头 
                /////////////test//////////// 
                //CString show; 
        //        file_s.SeekToEnd(); 
        //        int pos = file_s.GetPosition(); 
        //        show.Format("%d",pos); 
        //        MessageBox(show); 
                ///////////////////////////// 
 
                file_s.SeekToBegin(); 
                file_s.Read(&bmpfh,sizeof(BITMAPFILEHEADER)); 
                file_s.Read(&bmpih,sizeof(BITMAPINFOHEADER)); 
                W = bmpih.biWidth; 
                H = bmpih.biHeight; 
                long nwidthbytes; 
                nwidthbytes=(W*bmpih.biBitCount+31)/32*4;//每一行的占据的字节数,4的倍数 
                 
                ////////////test//////////////// 
                //pos = file_s.GetPosition();                 
                //show.Format("%d",pos); 
                //MessageBox(show); 
                //////////////////////////////// 
 
                //rgbdata = new BYTE [pos-54]; 
                rgbdata = new BYTE [nwidthbytes*H];//图像的大小 
 
                if( bmpih.biBitCount == 24 )//判断是否为24位图像 
                { 
                        //file_s.Read(rgbdata,pos-54); 
                        //skip = (pos-54)/H - W*3; 
                        file_s.Read(rgbdata,nwidthbytes*H); 
                        skip=nwidthbytes-W*3;//在不是4的倍数时补的字节数 
                        /* 
                        for(i=0;i<H;i++) 
                        { 
                                for(j=0;j<W*3;j++) 
                                { 
                                        if(j!=W*3-1) 
                                        { 
                                                file_s.Read(&rgbdata[i*W*3+j],sizeof(BYTE)); 
                                        } 
                                        else if(j== W*3-1 && skip == 0) 
                                        { 
                                                file_s.Read(&rgbdata[i*W*3+j],sizeof(BYTE)); 
                                        } 
                                 
                                        else if(j==W*3-1 && skip!=0) 
                                        { 
                                                file_s.Read(&rgbdata[i*W*3+j],sizeof(BYTE)); 
                                                file_s.Seek(skip*3,CFile::current); 
                                        } 
                                } 
                        } 
                        */ 
 
                        ///////////////test////////////////// 
                        //pos = file_s.GetPosition(); 
                        //show.Format("%d",pos-54); 
                        //MessageBox(show); 
                        /////////////////////////////////// 
                } 
                else 
                { 
                        MessageBox("需要24位位图"); 
                        return; 
                } 
                //MessageBox("数据读取成功!"); 
 
                //开始灰度化 
                graydata = new BYTE [H*W];//灰度图大小 
                 
                int count=0; 
                //for(i=0;i<pos-54;i+=3) 
                //{                                         
                //        graydata[count++] = rgbdata[i]*0.119+rgbdata[i+1]*0.587+rgbdata[i+2]*0.299; 
                //} 
                for(i=0;i<H;i++) 
                { 
                        for(j=0;j<W*3;j+=3) 
                        { 
                 
                                        graydata[count++] = rgbdata[i*W*3+j+i*skip]*0.12+rgbdata[i*W*3+j+1+i*skip]*0.58 
                                                                +rgbdata[i*W*3+j+2+i*skip]*0.3; 
                         
                        } 
                } 
                 
                MessageBox("灰度化结束,开始生成灰度图"); 
                /////////////////////////////////////////// 
                /////////生成灰度图片////////////////////// 
                /////////////////////////////////////////// 
                if(W%4==0) 
                        skip=0; 
                else 
                        skip = 4-W%4; 
                //生成调色板 
                RGBQUAD rgbquad[256]; 
                for(i=0;i<256;i++) 
                { 
                        rgbquad[i].rgbBlue=rgbquad[i].rgbGreen=rgbquad[i].rgbRed=i; 
                        rgbquad[i].rgbReserved=0; 
                }         
                //文件头 
                BITMAPFILEHEADER bmpfh_gray; 
                bmpfh_gray.bfType = 0x4D42; 
                bmpfh_gray.bfSize = 54 + (W+skip)*H + 256*sizeof(RGBQUAD); 
                bmpfh_gray.bfOffBits = 54 + 256*sizeof(RGBQUAD); 
                bmpfh_gray.bfReserved1=0; 
                bmpfh_gray.bfReserved2=0; 
                 
                //信息头         
                BITMAPINFOHEADER bmpih_gray; 
                bmpih_gray.biSize = 40; 
                bmpih_gray.biWidth = W; 
                bmpih_gray.biHeight = H; 
                bmpih_gray.biPlanes =1; 
                bmpih_gray.biBitCount = 8; 
                bmpih_gray.biCompression = BI_RGB; 
                bmpih_gray.biSizeImage=(W+skip)*H; 
                bmpih_gray.biXPelsPerMeter = 0L; 
                bmpih_gray.biYPelsPerMeter = 0L; 
                bmpih_gray.biClrUsed = 0L; 
                bmpih_gray.biClrImportant=0L; 
 
                //开始写数据 
                BYTE black=0x00; 
                CString path_d("c:\\1.bmp"); 
                if(file_d.Open(path_d,CFile::modeCreate|CFile::modeWrite|CFile::shareDenyNone)) 
                { 
                        file_d.Write(&bmpfh_gray,sizeof(BITMAPFILEHEADER)); 
                        file_d.Write(&bmpih_gray,sizeof(BITMAPINFOHEADER)); 
                        file_d.Write(rgbquad,sizeof(RGBQUAD)*256); 
                        for(i=0;i<H;i++) 
                        { 
                                for(j=0;j<W;j++) 
                                { 
                                        file_d.Write(&graydata[i*W+j],sizeof(BYTE)); 
                                } 
                                for(int s=0;s<skip;s++) 
                                { 
                                        file_d.Write(&black,sizeof(BYTE)); 
                                } 
                        } 
                } 
 
                file_d.Close(); 
                 
                delete graydata; 
                delete rgbdata; 
        } 
 
} 
 
 
 |   
 
 
 
 |