• MFC实现位图序列播放并计算位图亮度


    /**********************************************************
    功能:选择图像序列文件夹后调用该线程进行播放序列
    参数:对话框句柄
    作者:airduce
    时间:2018-9-26 10:02:46
    修改时间:无
    修改内容:新建
    ********************************************************************/
    UINT ThreadOne(LPVOID lpParameter){
        //showPic(0,TRUE);
        CMFCDialogDlg *mydlg =(CMFCDialogDlg *)  lpParameter;
    
        mydlg->m_lbl_total = 1000;
        CString selectPath;
        mydlg->GetDlgItemTextW(IDC_MFCEDITBROWSE1,selectPath);
        string StrSelectPath(CW2A(selectPath.GetString()));
        StrSelectPath = StrSelectPath + "\";
        const char * myPath = StrSelectPath.data();
        CString EntName("bmp");
    
        vector<string> myStrings = listFiles(myPath);
        mydlg->m_slider.SetRange(0,myStrings.size()-1);
        //总帧数
        mydlg->m_lbl_total=myStrings.size();
        while (true){
            if(index==myStrings.size()){
                Sleep(100);
                continue;
            }
            if(!flag){
                Sleep(100);
                continue;
            }
            //当前帧显示值
            mydlg->m_lbl = index+1;
            //设置拉条位置
            mydlg->m_slider.SetPos(index);
    
            CString BmpName( myStrings.at(index).c_str());
            mydlg->m_lbl_name = BmpName;
            //mydlg->UpdateData(FALSE);
            CString _path("\");
            BmpName =  selectPath + _path +BmpName;
            EntName.MakeLower();  
            if(EntName.Compare(_T("bmp")) == 0)
            {
                //定义变量存储图片信息
                BITMAPINFO *pBmpInfo;       //记录图像细节
                BYTE *pBmpData;             //图像数据
                BITMAPFILEHEADER bmpHeader; //文件头
                BITMAPINFOHEADER bmpInfo;   //信息头
                CFile bmpFile;              //记录打开文件
    
                //以只读的方式打开文件 读取bmp图片各部分 bmp文件头 信息 数据
                if(!bmpFile.Open(BmpName, CFile::modeRead|CFile::typeBinary)) 
                    return 0;
                if (bmpFile.Read(&bmpHeader,sizeof(BITMAPFILEHEADER)) != sizeof(BITMAPFILEHEADER))
                    return 0;
                if (bmpFile.Read(&bmpInfo,sizeof(BITMAPINFOHEADER)) != sizeof(BITMAPINFOHEADER))
                    return 0;
                pBmpInfo = (BITMAPINFO *)new char[sizeof(BITMAPINFOHEADER)];
                //为图像数据申请空间
                memcpy(pBmpInfo,&bmpInfo,sizeof(BITMAPINFOHEADER));
                DWORD dataBytes = bmpHeader.bfSize - bmpHeader.bfOffBits;
                pBmpData = (BYTE*)new char[dataBytes];
                bmpFile.Read(pBmpData,dataBytes);
                //获取位图亮度值
            /****************************************************************/
                if(bmpInfo.biBitCount==24){
                    double  radL[256*256];
                    double  maxradl=0; //最高亮度
                    double  minradl=65535;//最小亮度
                    double  meanradl;//最大亮度
                    double  sum=0;
                    for(int row = 0; row < 256; row++) {
                        for(int col = 0; col < 256; col++) {
                            BYTE R = pBmpData[256 * row * 3 + col * 3 + 0];
                            BYTE G = pBmpData[256 * row * 3 + col * 3 + 1];
                            BYTE B = pBmpData[256 * row * 3 + col * 3 + 2];
                            radL[row*256+col] = R*100+G+B/255.0; //辐射亮度
                            sum+=radL[row*256+col];
                            if(radL[row*256+col]>maxradl)
                                maxradl=radL[row*256+col];
                            if(radL[row*256+col]<minradl)
                                minradl=radL[row*256+col];
                            //frameimage[row*256+col]=radL[row*256+col];
                        }
                    }
                    meanradl=sum/65536;
                    maxradl = ((double)((int)((maxradl+0.005)*100)))/100;
                    meanradl = ((double)((int)((meanradl+0.005)*100)))/100;
                    mydlg->max_lum = maxradl;
                    mydlg->ave_lum = meanradl;
                }
            /****************************************************************/
    
                //bmpFile.Read(pBmpData,dataBytes);
                bmpFile.Close();
    
                //显示图像
                CWnd *pWnd=mydlg->GetDlgItem(IDC_STATIC_PIC); //获得pictrue控件窗口的句柄
                CRect rect;
                pWnd->GetClientRect(&rect); //获得pictrue控件所在的矩形区域
                CDC *pDC=pWnd->GetDC(); //获得pictrue控件的DC
                pDC->SetStretchBltMode(COLORONCOLOR);
                StretchDIBits(pDC->GetSafeHdc(),0,0,rect.Width(),rect.Height(),0,0,    bmpInfo.biWidth,bmpInfo.biHeight,pBmpData,pBmpInfo,DIB_RGB_COLORS,SRCCOPY);
    
                delete pBmpInfo;
                delete pBmpData;
                Sleep(15);
                index++;
            }
        }
    
        ExitThread(0);
        return 0;
    }

    运行效果:

  • 相关阅读:
    Java SE 5.0(JDK 1.5)新特性
    第22章—开启HTTPS
    第21章—websocket
    IE8Get请求中文不兼容:encodeURI的使用
    JavaScript自定义函数
    disable的错误使用
    20190401-记录一次bug ConstraintViolationException
    new Date()的浏览器兼容性问题
    单例模式(转)
    SQL Server使用一个语句块批量插入多条记录的三种方法和union和union all区别
  • 原文地址:https://www.cnblogs.com/airduce/p/9708953.html
Copyright © 2020-2023  润新知