首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用glDrawPixels渲染位图原始数据

使用glDrawPixels渲染位图原始数据
EN

Stack Overflow用户
提问于 2013-11-18 09:31:23
回答 1查看 1.2K关注 0票数 0

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

代码语言:javascript
复制
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);
}
EN

回答 1

Stack Overflow用户

发布于 2013-11-18 12:17:00

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

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

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

在本例中,如果宽度与默认的4字节边界不对齐,请确保设置glPixelStorei(GL_UNPACK_ALIGNMENT, 1)。对于GL_BGR,With像素是3个字节,默认情况下,假设每一行像素都被填充到下一个4字节的边界。

编辑

好的,看起来图像使用了调色板。这意味着QByteArray中的每个值都映射到另一个数组中的rgb值。我不能百分之百确定调色板在哪里,也许可以隐式计算,但是您提到了GetClrTabAddress,这听起来很有前途。

然后,代码将如下所示

代码语言:javascript
复制
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;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20044302

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档