tags:

views:

211

answers:

1

I have a char* data, where every char represents red/green/blue/alpha value of a pixel.

So, the first four numbers are red, green, blue and alpha value of the first pixel, the next four are R, G, B, A value of the pixel on the right and so on.

It represents a picture (with previously known width and height).

Now, I want to somehow take this array and display it on Qt window. How to do it?

I know I should somehow use QPixmap and/or QImage, but I cannot find anything helpful in the documentation.

+1  A: 

QImage is designed for access to the various pixels (among other things), so you could do something like this:

QImage DataToQImage( int width, int height, int length, char *data )
{
    QImage image( width, height, QImage::Format_ARGB32 );
    assert( length % 4 == 0 );
    for ( int i = 0; i < length / 4; ++i )
    {
        int index = i * 4;
        QRgb argb = qRgba( data[index + 1], //red
                           data[index + 2], //green
                           data[index + 3], //blue
                           data[index] );   //alpha
        image.setPixel( i, argb );
    }
    return image;
}

Based on coming across another constructor, you might also be able to do this:

QImage DataToQImage( int width, int height, int length, const uchar *data )
{
    int bytes_per_line = width * 4;
    QImage image( data, width, height, bytes_per_line, 
                     QImage::Format_ARGB32 );
    // data is required to be valid throughout the lifetime of the image so 
    // constructed, and QImages use shared data to make copying quick.  I 
    // don't know how those two features interact, so here I chose to force a 
    // copy of the image.  It could be that the shared data would make a copy
    // also, but due to the shared data, we don't really lose anything by 
    // forcing it.
    return image.copy();
}
Caleb Huitt - cjhuitt
Instead of the manual shifting use QRgb rgba = qRgba(r,g,b,a). But I prefer the second solution.
TimW
@TimW: Thanks, I edited the example to use that function, which I'd completely forgotten about. (I did try to find the QRgb constructor, though...)
Caleb Huitt - cjhuitt