[Qt-interest] How to paint the Background of QImage without loosing its Foreground Contents.

Samuel Rødal sroedal at trolltech.com
Tue Aug 4 13:07:38 CEST 2009


>>   Well, i'm trying to make a painting application. I'm getting some trouble with setting the background color.
>>
>>   I've QImage object as my painting space, hence i used QImage->fill() fuction to fill the QImage with a particular color.
>>
>>   But, if i scribble something on QImage (with Pen) and then use fill function, it clears everything n fills the image with the new color (well, that's obvious)...
>>
>>   Hence I've run nested for loops to access each pixel of Qimage and check whether it is already colored with Pen, if it is not then i call setPixel() function to color it with background color. 
>>
>>   But its not working, each pixel is still getting painted.
>>
>> Here is the code
>>
>> ******************************************************************************
>> //mBColor is of type QRgb.
>> void PaintWidget::setBColor(QRgb color) //sets the Background Color
>> {
>>     mBColor = color;
>>     int x, y;
>>     for(x = 0; x <= mPaintImage->width() - 1; x++) 
>>     {
>>         for(y = 0; y <= mPaintImage->height() - 1; y++)
>>         {
>>             if(QColor(mPaintImage->pixel(x, y)) != mFColor) //mFColor is 
>>             {                                               //Foregournd 
>>                 mPaintImage->setPixel(x, y, mBColor);       //Ccolor.  
>>             }
>>         }
>>     }
>>    emit bColorChanged(mBColor);
>>    update();
>> }
>>
>> *******************************************************************************
>>
>>   I'm Desperately looking for some help.
>>
>> -Varun

Sounds like a better solution is two separate this into two layers, one 
foreground layer which is a QImage with Format_ARGB32_Premultiplied and 
a transparent background, and a background layer which is just a simple 
fill color. Then when you want to display the image first do a fill rect 
  the size of the image with the background color, and then draw the 
image on top with SourceOver compositing (the default QPainter 
composition mode).

--
Samuel



More information about the Qt-interest-old mailing list