c/c++ 将 RGBQUAD 数组分配给位图

Posted

技术标签:

【中文标题】c/c++ 将 RGBQUAD 数组分配给位图【英文标题】:c/c++ assign RGBQUAD array to a bitmap 【发布时间】:2013-06-24 09:17:06 【问题描述】:

我正在做一个程序,您可以在其中截取窗口的屏幕截图,然后扫描该图片的每个像素。但是我在将 RGBQUAD 数组分配给拍摄的屏幕时遇到问题。每个像素都有相同的 RGB,即 205。这是我的一段代码:

RGBQUAD *pixel = malloc((ssWidth * ssHeight)* sizeof(RGBQUAD));
hdcScreen = GetDC(gameHandle);
hdc = CreateCompatibleDC(hdcScreen);
hBmp = CreateCompatibleBitmap(hdcScreen, ssWidth, ssHeight);
SelectObject(hdc, hBmp);

BitBlt(hdc, 0, 0, ssWidth, ssHeight, hdcScreen, xCenter, yCenter, SRCCOPY);

GetDIBits(hdc, hBmp, 0, ssHeight, pixel, &bmpInfo, DIB_RGB_COLORS);

int p = -1;

for(y_var = 0; y_var < ssWidth; y_var++)

    for(x_var = 0; x_var < ssHeight; x_var++)
    
        if(ComparePixel(&pixel[++p]))
        
            SetCursorPos(xCenter + x_var + 3, yCenter + y_var + 3);
        
    


bool ComparePixel(RGBQUAD *pixel)

    printf("%d, %d, %d\n"; pixel -> rgbRed, pixel -> rgbGreen, pixel -> rgbBlue);
    return false;

ComparePixel(RGBQUAD *pixel) 函数只检查 RGB 值。如何将 RGBQUAD 分配给屏幕截图的位图?

【问题讨论】:

【参考方案1】:

多个问题。

    RGBQUAD **pixel = malloc(...free(*pixel) 似乎是问题所在。我想你想要RGBQUAD *pixel = malloc((ssWidth * ssHeight)* sizeof(RGBQUAD));(只有1个*

    怀疑pixels中的GetDIBits() s/b pixel

    我想你想要y_var = 0; (x_var = 0; 还有)

    ComparePixel() 未定义,但我认为您想要更接近if(ComparePixel(pixel[x_var+(y_var*ssWidth)], the_pixel_to_compare_against))

    free(*pixel); s/b _after 2 for 循环应该是free(pixel)

【讨论】:

好的,尽管有错误,我仍然没有得到结果。如果像素匹配,函数ComparePixel(RGBQUAD *pixel) 返回真。然而 RGBQUAD 要么混淆了,因为它给了我一种混合像素,但颜色匹配,或者错误在其他地方。 请提供更多关于函数ComparePixel()的信息,包括它的声明。您的使用似乎只给了它 1 个像素 - 那么它与那个 pizel 相比是什么? ComparePixel() 你的代码是库函数吗? 我已经编辑了代码。 ComparePixel 现在只打印当前像素的 RGB。 1.现在看起来好多了,你的printf 输出是什么? 2:问题“GetDIBits and loop through pixels using X, Y”可能会提供所需的信息。 3. 如果 ssWidth 不是 4 的倍数,则可能存在 RGBQAUD 对齐问题。 4. 你的 RGB 是205,也许你的 .bmp 文件是 1 字节索引/像素格式(256 色)。确保它是 24 位/像素格式。 没关系,我修好了。我不得不删除bmpInfo.bmiHeader.biSize = 0。感谢您的额外帮助。

以上是关于c/c++ 将 RGBQUAD 数组分配给位图的主要内容,如果未能解决你的问题,请参考以下文章

使用 JNI 和 NDK 旋转位图

24位位图bmp转换为字符

使用 libpng 将位图缓冲区快速编码为 png

如何将双数组列表转换为位图? [关闭]

从内存创建 Windows GDI 位图

将位图数组转换为 YUV(420 平面)?