L.Urus 发表于 2014-4-8 15:19:58

求大神帮我解释一下灰度转化下面红色标注的for循环,小弟新手,谢谢!!

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 ;
                rgbdata = new BYTE ;//图像的大小

                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,sizeof(BYTE));
                                        }
                                        else if(j== W*3-1 && skip == 0)
                                        {
                                                file_s.Read(&rgbdata,sizeof(BYTE));
                                        }
                               
                                        else if(j==W*3-1 && skip!=0)
                                        {
                                                file_s.Read(&rgbdata,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 ;//灰度图大小
               
                int count=0;
                //for(i=0;i<pos-54;i+=3)
                //{                                       
                //        graydata = rgbdata*0.119+rgbdata*0.587+rgbdata*0.299;
                //}
                for(i=0;i<H;i++)
                {
                        for(j=0;j<W*3;j+=3)
                        {
               
                                        graydata = rgbdata*0.12+rgbdata*0.58
                                                              +rgbdata*0.3;
                       
                        }
                }
               
                MessageBox("灰度化结束,开始生成灰度图");
                ///////////////////////////////////////////
                /////////生成灰度图片//////////////////////
                ///////////////////////////////////////////
                if(W%4==0)
                        skip=0;
                else
                        skip = 4-W%4;
                //生成调色板
                RGBQUAD rgbquad;
                for(i=0;i<256;i++)
                {
                        rgbquad.rgbBlue=rgbquad.rgbGreen=rgbquad.rgbRed=i;
                        rgbquad.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,sizeof(BYTE));
                                }
                                for(int s=0;s<skip;s++)
                                {
                                        file_d.Write(&black,sizeof(BYTE));
                                }
                        }
                }

                file_d.Close();
               
                delete graydata;
                delete rgbdata;
        }

}


动感超人xx 发表于 2014-5-13 15:55:42

鱼币鱼币~~~~~~~~~~
页: [1]
查看完整版本: 求大神帮我解释一下灰度转化下面红色标注的for循环,小弟新手,谢谢!!