IPicture * pPicture = NULL;
   RECT m_PicRect; // 保存图片验证码矩形区域    BITMAPFILEHEADER filehead;
   BITMAPINFOHEADER fileinfo;
   RGBTRIPLE *rgb=NULL; ::CoInitialize(NULL); // 初始化COM 
HRESULT hr,hr2; 
CFile file;
//CPaintDC dc(this);
CClientDC   dc(this); IStream *pStream = NULL; file.Open(strPath, CFile::modeRead | CFile::shareDenyNone); DWORD dwSize = file.GetLength(); 
HGLOBAL hMem = ::GlobalAlloc( GMEM_MOVEABLE, dwSize ); 
//LPVOID lpBuf = ::GlobalLock( hMem );        LPBYTE lpTemp=(LPBYTE)::GlobalLock( hMem );; //全图字节数的一个数组  
file.Read(lpTemp, dwSize);
file.Close(); 
::GlobalUnlock( hMem );  // 由HGLOBAL得到IStream,参数TRUE 表示释放IStream的同时,释放内存 
hr = ::CreateStreamOnHGlobal(hMem, TRUE, &pStream ); //
ASSERT(SUCCEEDED(hr)); 
BYTE gray;  
hr = ::OleLoadPicture(pStream, dwSize, TRUE, IID_IPicture, (LPVOID *)&pPicture); 
ASSERT(hr == S_OK);        //-------------------------------------------------------------------------------------------------------------------------------------
long nWidth,nHeight; // 宽高 MM_HIMETRIC模式,单位是0.01毫米 
pPicture->get_Width( &nWidth ); // 宽 
pPicture->get_Height( &nHeight ); // 高 pPicture->Release(); long nPicWidth = MulDiv(nWidth, GetDeviceCaps(GetDC()->m_hDC, LOGPIXELSX), HIMETRIC_PER_INCH);
        long nPicHeight = MulDiv(nHeight, GetDeviceCaps(GetDC()->m_hDC, LOGPIXELSY), HIMETRIC_PER_INCH);
      DWORD i=0;   
  DWORD count=nPicWidth*nPicHeight; //象素数    while(i<count)   
  {   
  gray=(BYTE)((float)lpTemp[0]*0.299+(float)lpTemp[1]*0.587+(float)lpTemp[2]*0.114); 
  //gray=(lpTemp[0]+lpTemp[1]+lpTemp[2])/3;
  *lpTemp++=gray;   
  *lpTemp++=gray;   
  *lpTemp++=gray; // *lpTemp=*lpTemp+gray; 
  i++;   
  } /**/  CSize sz(nWidth, nHeight); // 原大显示
 dc.HIMETRICtoDP(&sz); // 转换MM_HIMETRIC模式单位为MM_TEXT像素单位 
 OLE_XPOS_HIMETRIC xSrc;  // 图片中当前显示区域的x
 OLE_YPOS_HIMETRIC ySrc;  // 图片中当前显示区域的y
 OLE_XSIZE_HIMETRIC cxSrc = nPicWidth; // 图片中当前显示区域的宽度
 OLE_YSIZE_HIMETRIC cySrc = nPicHeight; // 图片中当前显示区域的高度         pPicture->Render(dc.m_hDC, 135, 680, nPicWidth, nPicHeight, 0, nHeight, nWidth, -nHeight, NULL);
     
CRect rect(10,100,sz.cx + 10,sz.cy + 100); // 将图片区域保存,以便后面只刷新图片区域
m_PicRect = rect;
if(pPicture) // 释放IPicture指针
pPicture->Release(); if(pStream) // 释放IStream指针,同时释放hMem
pStream->Release();
::CoUninitialize();

解决方案 »

  1.   

    *lpTemp 你在哪里使用这个值了,没有看出来!!
      

  2.   


    lpTemp是指针啊,有变化的啊 
      

  3.   

    lpTemp 就是指向 hMem内存的指针
      

  4.   

    你这样转换灰度对不对呀?
    gray=(BYTE)((float)lpTemp[0]*0.299+(float)lpTemp[1]*0.587+(float)lpTemp[2]*0.114); 
    你是否应该对没个Index值都要进行转换,而不是第一个呢?
    gray=(BYTE)((float)lpTemp[i]*0.299+(float)lpTemp[i+1]*0.587+(float)lpTemp[i+2]*0.114);而且这样看感觉这副Bmp图要是24Bit才对,楼主为何不直接解Bmp图像格式去转.
      

  5.   


    IPicture * pPicture = NULL;
    RECT m_PicRect; // 保存图片验证码矩形区域BITMAPFILEHEADER filehead;
    BITMAPINFOHEADER fileinfo;
    RGBTRIPLE *rgb=NULL;::CoInitialize(NULL); // 初始化COM  
    HRESULT hr,hr2;  
    CFile file;
    //CPaintDC dc(this);
    CClientDC dc(this);IStream *pStream = NULL;file.Open(strPath, CFile::modeRead | CFile::shareDenyNone);DWORD dwSize = file.GetLength();  
    HGLOBAL hMem = ::GlobalAlloc( GMEM_MOVEABLE, dwSize );  
    //LPVOID lpBuf = ::GlobalLock( hMem );  LPBYTE lpTemp=(LPBYTE)::GlobalLock( hMem );; //全图字节数的一个数组   
    file.Read(lpTemp, dwSize);
    file.Close();  
    ::GlobalUnlock( hMem );  // 由HGLOBAL得到IStream,参数TRUE 表示释放IStream的同时,释放内存  
    hr = ::CreateStreamOnHGlobal(hMem, TRUE, &pStream ); //
    ASSERT(SUCCEEDED(hr));  
    BYTE gray;   
    hr = ::OleLoadPicture(pStream, dwSize, TRUE, IID_IPicture, (LPVOID *)&pPicture);  
    ASSERT(hr == S_OK);    //-------------------------------------------------------------------------------------------------------------------------------------
    long nWidth,nHeight; // 宽高 MM_HIMETRIC模式,单位是0.01毫米  
    pPicture->get_Width( &nWidth ); // 宽  
    pPicture->get_Height( &nHeight ); // 高pPicture->Release();long nPicWidth = MulDiv(nWidth, GetDeviceCaps(GetDC()->m_hDC, LOGPIXELSX), HIMETRIC_PER_INCH);
      long nPicHeight = MulDiv(nHeight, GetDeviceCaps(GetDC()->m_hDC, LOGPIXELSY), HIMETRIC_PER_INCH);
        DWORD i=0;   
    DWORD count=nPicWidth*nPicHeight; //象素数  gray=(BYTE)((float)lpTemp[0]*0.299+(float)lpTemp[1]*0.587+(float)lpTemp[2]*0.114);  
    //gray=(lpTemp[0]+lpTemp[1]+lpTemp[2])/3;
    *lpTemp++=gray;   
    *lpTemp++=gray;   
    *lpTemp++=gray; 因为图片是从网站下载的,下载下来就是24位图片,但是不知道为何这个图片不是标准的24位那种格式,如果采用ie的图片另存为,保存下来的就是标准的bmp格式。所以现在要采用ipicture来显示,然后转换成灰度图像
      

  6.   


    gray=(BYTE)((float)lpTemp[0]*0.299+(float)lpTemp[1]*0.587+(float)lpTemp[2]*0.114);   
    //gray=(lpTemp[0]+lpTemp[1]+lpTemp[2])/3;
    *lpTemp++=gray;   
    *lpTemp++=gray;   
    *lpTemp++=gray;  因为图片是从网站下载的,下载下来就是24位图片,但是不知道为何这个图片不是标准的24位那种格式,如果采用ie的图片另存为,保存下来的就是标准的bmp格式。所以现在要采用ipicture来显示,然后转换成灰度图像
      

  7.   

    到底是不是24 bit bmp,你可以验证,不知道你熟不熟Bmp格式,如果不熟的话你在网上搜搜。那你用上面提供的代码在跑一次试试,看有没有问题.
    24bit位图一个像素有3Byte, 3 * 8 = 24,
    因此:你想这样:
    你转换的过程是一个像素一个像素转换,因此单位要是3, 即 i += 3;
      

  8.   

    最终采用opencv库解决问题。谢谢大家。