c++ - 从像素获取 RGB 值并将 RGB 值设置回同一像素

标签 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);
    }

最佳答案

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

关于c++ - 从像素获取 RGB 值并将 RGB 值设置回同一像素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4207398/

相关文章:

c# - 将不同的文件复制到输出目录以进行发布和调试?

c++ - 错误 : call to implicitly-deleted copy constructor of 'std::__1::unique_ptr<A, std::__1::default_delete<A>>'

c++ - 将值插入可能为空指针的更简单方法

c++ - 为什么当你用键盘输入覆盖元素中已经存储的值时,字符串类型的数组不取数据?

c++ - 如何将全局变量传递给 C++ 中的函数?

visual-c++ - for循环外变量的作用域

c++ - 移动构造函数和继承

c++ - 如何在 C/C++ 中创建微 shell ?

c++ - 为什么 getcwd 失败并显示 errno ENOENT

c# - 有没有办法防止 Visual Studio 2008 Designer 在代码和设计窗口之间跳转时始终重绘窗口?