从像素获取RGB值并将rgb值设置回相同的像素

时间:2010-11-17 17:40:25

标签: c++ visual-studio visual-c++ mfc rgb

在下面的代码片段中,我尝试在Visual C ++中检索像素的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);
    }

1 个答案:

答案 0 :(得分:3)

您访问颜色值的方式是错误的。 GetRValue和其他函数旨在对COLORREF值进行操作,该值在内存中列为red-green-blue-reserved,而RGBQUAD的格式为blue-green-red-reserved。通过使用Get?Value上的RGBQUAD宏,您可以重新交换红色和蓝色通道。