我从服务器接收原始图像数据。服务器使用MS ()函数,它以BGR格式返回。现在,我想要做的是读取这些原始数据,并使用glDrawPixels在Linux中绘制它。我被告知,GetClrTabAddress函数在MS和类似的,将得到我的RGB值的每一个指数800乘600图像发送给我。我不知道如何使用索引来获得这些值。有人能给点建议吗。
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);
}发布于 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,这听起来很有前途。
然后,代码将如下所示
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;
}https://stackoverflow.com/questions/20044302
复制相似问题