鱼C论坛

 找回密码
 立即注册
查看: 1509|回复: 1

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

[复制链接]
发表于 2014-4-8 15:19:58 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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;
        }

}


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-5-13 15:55:42 | 显示全部楼层

回帖奖励 +1 鱼币

鱼币鱼币~~~~~~~~~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-24 08:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表