【问题标题】:using glDrawPixels to render bitmap raw data使用 glDrawPixels 渲染位图原始数据
【发布时间】:2013-11-18 09:31:23
【问题描述】:

我从服务器接收原始图像数据。服务器使用以 BGR 格式返回的 MS Dib() 函数。现在,我要做的是读取这些原始数据并使用 glDrawPixels 在 Linux 中绘制它。 有人建议我使用 MS 中的 GetClrTabAddress 函数等来获取发送给我的 800 x 600 图像的每个索引的 RGB 值。 我不知道如何使用索引获取这些值。谁能给点建议。

void func(QByteArray)
{
    window_width  = 800;
    window_height = 600;
    size = window_width * window_height;
    pixels = new float[size*3];
    memcpy(pixels, bytes, bytes.size());
}

void GlWidget::paintGL()
{
    //! [5]
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glDrawPixels(window_width,window_height,GL_RGB,GL_FLOAT,pixels);
}

【问题讨论】:

    标签: qt opengl qt4 qt5


    【解决方案1】:

    您可以在glDrawPixels 中使用GL_BGR,它会为您完成转换,并且可能会更快,因为 AFAIK GPU 会完成这项工作。

    QByteArray 听起来你应该使用无符号字节/chars 而不是floats,这意味着GL_UNSIGNED_BYTE

    我会assert(size*3*sizeof(float) == bytes.size());

    在这种情况下,如果您的宽度未与默认的 4 字节边界对齐,请确保设置 glPixelStorei(GL_UNPACK_ALIGNMENT, 1)。使用 GL_BGR 时,每个像素都是 3 个字节,默认情况下,像素的每一行都被假定为填充到下一个 4 字节边界。

    [编辑]
    好的,看起来图像使用了调色板。这意味着 QByteArray 中的每个值都映射到另一个数组中的 rgb 值。我不能 100% 确定调色板在哪里,也许可以隐式计算,但你提到了 GetClrTabAddress,这听起来很有希望。

    然后代码将如下所示

    for(int i = 0; i < size; ++i)
    {
        unsigned char index = btmp[i];
        //and something like..
        memcpy(bytes + i * 3, GetClrTabAddress() + index * 3, 3);
        //or
        bytes[i*3+0] = someOtherPaletteData[index].red;
        bytes[i*3+1] = someOtherPaletteData[index].green;
        bytes[i*3+2] = someOtherPaletteData[index].blue;
    }
    

    【讨论】:

    • 感谢您的回复,它在某种程度上很有用,但它不是完全解决方案,看看你的帖子,我编辑了下面的部分。
    • @user1596226 好的,现在更有意义了。
    • 感谢您的想法,虽然我的问题是我不知道调色板数据是什么,也不知道如何将索引映射到哪个调色板数组!
    • @user1596226 看看这个:en.wikipedia.org/wiki/BMP_file_format#Color_table。你有一个为你加载图像的库吗?它应该提供表格,您可以使用上面的memcpy 行(可能需要根据数据类型调整index * 3)。如果没有,找到一个将是一个好主意。或者按照 wiki 页面自行解压数据。
    猜你喜欢
    • 1970-01-01
    • 2011-01-27
    • 2022-01-01
    • 1970-01-01
    • 2012-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多