我从服务器接收原始图像数据。服务器使用MS Dib()函数,以BGR格式返回。现在,我想要做的是读取这些原始数据并使用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);
}
答案 0 :(得分:1)
您可以在GL_BGR
中使用glDrawPixels
,它将为您进行转换,并且可能会更快,因为AFAIK GPU将完成工作。
QByteArray
听起来你应该使用无符号字节/ char
而不是float
s,这意味着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;
}