[PyQt] QImage in BI24 format

Matt Newell newellm at blur.com
Wed Sep 19 17:31:55 BST 2012

On Wednesday, September 19, 2012 12:19:31 AM Gelonida N wrote:
> On 09/18/2012 08:13 PM, Gelonida N wrote:
> > Hi,
> > 
> > I have a C-library creating an image supposedly in in BI24 format (video
> > application)
> > 
> > Now I'd like to display the image.
> > 
> > I tried to set the pixel format to QImage.Format_RGB888
> > 
> > and I can see the image.
> > However the red and blue colors are inversed.
> > 
> > Is there another format, that can directly display the image?
> I managed to convice the other application to create the images in RGB32
> So for the time being my problem is solved.
> However I would still be interested to know, whether Qt can support the
> fourc 'BI24' format and if not, how one could convert most efficiently.

Any conversion is going to need to be implemented in C++ for best speed.

If you are looking for very high performance then you can use an opengl view 
to display the image and use one of the various shader languages to do 
anything you want with the texture(image) data, swapping two color components 
is especially easy once the plumbing is done to get a working view with 
shaders. That way no conversion is necessary on the main CPU.  If you do it 
this way you can upload the image data to an opengl texture without ever 
copying it into a QImage.  This is most likely going to require C++, though it 
may be possible from pure python with some combination of non-PyQt bindings 
and/or ctypes.

If you need the data in a QImage or an OpenGL view is not out of the question 
for whatever reason you can write your own QImageIO plugin that does the 
conversion while copying the data into the QImage, this avoids iterating 
through the image data more than once. This will have to be done in C++.

The next best way is to simply use a loop to iterate through the pixels and 
use qRgb/qRgba to get and set the values.  This is by far the easiest and is 
most likely plenty fast for most applications on modern computers.  Of course 
it will be quite a bit slower if implemented in python compared to C++.


More information about the PyQt mailing list