在回调函数FrameCallBack中很容易得到每幅图像的数据区 可是是24位的位图 怎样转换为灰度图呢? 从csdn以往的帖子里找了很多方法  都不会用  有没有不用句柄 调色板 就可以转化过去的? 给个例子  多谢!!!这个是我找到的一个并自己改了改  改错了  哪位看看还可以用不
BOOL Bmp2Gry(LPBYTE CaptureData, LPBYTE *lpGrayData)
{
CClientDC dc(CWnd::GetDesktopWindow());
RGBQUAD       rgb[256];
CBitmap bitmap;
bitmap.SetBitmapBits(320*240*3,CaptureData);
CDC memdc; 
memdc.CreateCompatibleDC(&dc); 
memdc.SelectObject( &bitmap );
::GetDIBColorTable( memdc, 0, 256 , rgb ); int nBmpSize = 0;
nBmpSize = ((((320 * 24) + 31) & ~31) >> 3) * 240; if(*lpGrayData == NULL)
*lpGrayData = new BYTE[nBmpSize];
memset(*lpGrayData, 0, nBmpSize);
for(int i = 0; i < nBmpSize; i ++)
{
int nIndex = CaptureData[i];
double r = (double)(rgb[nIndex].rgbRed);
double g = (double)(rgb[nIndex].rgbGreen);
double b = (double)(rgb[nIndex].rgbBlue);
BYTE c = (BYTE)(r*0.29900 + g*0.58700 + b*0.11400);
int pos = ((240 - (i/320) - 1)*320) + (i % 320);
(*lpGrayData)[pos] = c;
}

delete []CaptureData;
CaptureData = NULL; return TRUE;
}
多谢!!

解决方案 »

  1.   

    自己刚写了个你那种要求的,运行没问题,你的我再看
    你也可以留邮箱下来,我把源码发给你
    void CMultiphotohouseDoc::OnDetectlineCs() 
    {
    // TODO: Add your command handler code here
    int height,width;
    int i,j,k;// 行列号,k值
    BYTE gray[3],Gray;
    height=GetPhotoHeight();//获得图片的高度
    width=GetPhotoWidth();//获得图片的宽度
       
       m_pGrayImg=new BYTE[width*height];
       m_Photo.ReadGrayImageData(m_pGrayImg,0,0,height,width);      
       
       for(i=0;i<height-3;i++)
       for(j=0;j<width;j++)
       {  
       for(k=0;k<3;k++)
       gray[k] = *(m_pGrayImg+i*width+j*3+k);
       
       Gray=(BYTE)0.114*gray[0]+0.587*gray[1]+0.299*gray[2];
       
       for(k=0;k<3;k++)
       *(m_Photo.m_Photo.pData+i*3*width+j*3*3+k)=Gray;    
       }        
       
       UpdateAllViews(NULL);
       
       delete m_pGrayImg;     
    }
      

  2.   

    谢谢你! 可是  我不清楚 m_Photo.ReadGrayImageData(m_pGrayImg,0,0,height,width); 这一句是怎么来的呢   m_Photo是个什么东东?
      

  3.   

      明天来看  今天睡觉了  good night!