2010-11-17 107 views
0

在下面的代碼片段中,我試圖檢索Visual C++中像素的RGB值,然後將相同的RGB值設置爲相同的像素。即這只是一個測試。但是,當我這樣做時,產生的圖像是相似的,但顏色錯誤/關閉。生成的圖像看起來完全缺失原始圖像的黃色像素。爲什麼我在這之後沒有收到相同的圖像?非常感激任何的幫助。 謝謝從像素獲取RGB值並將rgb值設置回同一像素

 BYTE *pbBitmap; 
    HBITMAP hDestBitmap = CreateDIBSection(memDC1, &bi, DIB_RGB_COLORS,(void**)&pbBitmap, NULL, 0); 

    if (hDestBitmap){ 
     SelectObject(DestDC2, hDestBitmap); 
     BitBlt(DestDC2, 0, 0, nX, nY, memDC1, 0, 0, SRCCOPY); 

     RGBQUAD *pRGB; 
     LONG nPixels; 
     for (pRGB = (RGBQUAD *)pbBitmap, nPixels = (nX * nY); nPixels > 0; ++pRGB, --nPixels){ 
      ULONG* pSrc =(ULONG*)pRGB; 
      ULONG nRed = GetRValue(*pSrc); 
      ULONG nGreen = GetGValue(*pSrc); 
      ULONG nBlue = GetBValue(*pSrc); 

      pRGB->rgbRed=nRed; 
      pRGB->rgbGreen=nGreen; 
      pRGB->rgbBlue=nBlue; 
     } 

     CRect rctPicture2; 
     m_Picture2.GetWindowRect(&rctPicture2); 
     ScreenToClient(&rctPicture2); 
     dc.SetStretchBltMode(COLORONCOLOR); 
     StretchBlt(dc,rctPicture2.left,rctPicture2.top,rctPicture2.Width(),rctPicture2.Height(),DestDC2,0,0,1152,864,SRCCOPY); 
    } 

回答

3

您訪問顏色值的方式是錯誤的。 GetRValue和其他功能是爲了在內存中作爲red-green-blue-reserved而在COLORREF值上操作,而RGBQUAD的格式是blue-green-red-reserved。通過在RGBQUAD上使用Get?Value宏,即可交換紅色和藍色通道。