Sam
Sam

Reputation: 873

using glDrawPixels to render bitmap raw data

I receive raw image data from server. The server uses MS Dib() function which returns in BGR format. Now, what i want to do is to read this raw data and use glDrawPixels to draw it in Linux. I was advised that GetClrTabAddress function in MS and alike shall be used to get me the RGB values for each index of 800 by 600 image sent to me. I do not know how to get these values using indices. Could anyone give some tips.

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);
}

Upvotes: 0

Views: 1314

Answers (1)

jozxyqk
jozxyqk

Reputation: 17266

You can use GL_BGR in glDrawPixels, which will do the conversion for you and will probably be faster since AFAIK the GPU will do the work.

QByteArray sounds like you should be using unsigned bytes/chars instead of floats, which means GL_UNSIGNED_BYTE.

I'd assert(size*3*sizeof(float) == bytes.size());.

In this case make sure to set glPixelStorei(GL_UNPACK_ALIGNMENT, 1) if your width doesn't align to the default 4-byte boundry. With GL_BGR very pixel is 3 bytes and by default each row of your pixels is assumed to be padded to the next 4-byte boundary.

[EDIT]
OK, it looks like the image uses a palette. This means every value inthe QByteArray maps to an rgb value in another array. I'm not 100% sure where the palette is and maybe it can be computed implicitly, but you mentioned GetClrTabAddress which sounds promising.

The code will then look something like this

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;
}

Upvotes: 1

Related Questions