Nika
Nika

Reputation: 1964

Raw data to QImage

I'm new to graphics programming (pixels, images, etc..) I'm trying to convert Raw data to QImage and display it on QLabel. The problem is that, the raw data can be any data (it's not actually image raw data, it's binary file.) The reason if this is that, to understand deeply how pixels and things like that work, I know I'll get random image with weird results, but it will work. I'm doing something like this, but I think I'm doing it wrong!

QImage *img = new QImage(640, 480, QImage::Format_RGB16); //640,480 size picture.
//here I'm trying to fill newly created QImage with random pixels and display it.
for(int i = 0; i < 640; i++)
{
    for(int u = 0; u < 480; u++)
    {
        img->setPixel(i, u, rawData[i]);
    }
}
ui->label->setPixmap(QPixmap::fromImage(*img));

am I doing it correctly? By the way, can you point me where should I learn these things? Thank you!

Upvotes: 7

Views: 21880

Answers (3)

karlphillip
karlphillip

Reputation: 93410

This is how I saved a raw BGRA frame to the disk:

QImage image((const unsigned char*)pixels, width, height, QImage::Format_RGB32);
image.save("out.jpg");

Upvotes: 4

Tyler Jandreau
Tyler Jandreau

Reputation: 4335

Syntactically, your code appears to be correct.

Reading the class signature, you may want to call setPixel in the following manner:

img->setPixel(i, u, QRbg(##FFRRGGBB));

Where ##FFRRGGBB is a color quadruplet, unless, of course, you want monochrome 8 bit support.

Additionally, declaring a naked pointer is dangerous. The following code is equivalent:

QImage image(640, 480, QImage::Format_something);
QPixmap::fromImage(image);

And will deallocate appropriately upon function completion.

Qt Examples directory is a great place to search for functionality. Also, peruse the class documentation because they're littered with examples.

Upvotes: 0

york.beta
york.beta

Reputation: 1827

Overall it's correct. QImage is a class that allows to manipulate its own data directly, but you should use correct pixel format.

A bit more efficient example:

QImage* img = new QImage(640, 480, QImage::Format_RGB16);
for (int y = 0; y < img->height(); y++)
{
    memcpy(img->scanLine(y), rawData[y], img->bytesPerLine());
}

Where rawData is a two-dimension array.

Upvotes: 7

Related Questions