imagecomposition工程存放在Qt安装目录下的
Examples\Qt-x.xx.xx\widgets\painting\imagecomposition
目录下。其中
x.xx.xx为Qt的版本号。该工程展示了QPainter::CompositionMode的含义。要弄懂本工程请先参考《QPainter类的CompositionMode各值含义》
,否则本工程对初学者很难弄懂。
预备知识:
把将要画上去的颜色称为“源颜色”,把原来的颜色称为“目标颜色”。初次画的时候,窗体上什么都没有,则窗体或窗体的一个区域(当运用裁剪时)为目标,即将要画上去的图形为源。
弄懂本工程的关键是要搞懂QPainter类的CompositionMode各值含义、源图像和目标图像的概念。
loadImage函数分析
该工程的loadImage函数代码如下:
void ImageComposer::loadImage(const QString &fileName, QImage *image,
QToolButton *button)
{
image->load(fileName);
// Scale the image to given size
*image = image->scaled(resultSize, Qt::KeepAspectRatio);
QImage fixedImage(resultSize, QImage::Format_ARGB32_Premultiplied);
QPainter painter(&fixedImage);
painter.setCompositionMode(QPainter::CompositionMode_Source);
painter.fillRect(fixedImage.rect(), Qt::transparent);
painter.setCompositionMode(QPainter::CompositionMode_SourceOver);
painter.drawImage(imagePos(*image), *image);
painter.end();
button->setIcon(QPixmap::fromImage(fixedImage));
*image = fixedImage;
recalculateResult();
}
当代码执行到第11行但11行后的代码没执行时,即将第12、13、19行代码注释掉,根据前面源和目标的定义可以知道:此时窗体为目标,fixedImage为源,根据《QPainter类的CompositionMode各值含义》文章对QPainter::CompositionMode_Source的描述,可以知道,此时只显示源,但因为fixedImage设置为透明的,所以即使显示的是源,但看到的是源后面的窗体,如下:

如果将第11行改为:
painter.fillRect(fixedImage.rect(), Qt::red);
则输出如下:

因为源是红色的,不再透明,所以看不到后面的窗体,显示的是源的红色。将第11行依然设置为红色,取消12、13行注释,则此时11行绘制上去的红色QImage对象fixedImage为目标,第13行绘制的image对象为源,因为绘图组合模式是QPainter::CompositionMode_SourceOver,根据《QPainter类的CompositionMode各值含义》文章对QPainter::CompositionMode_SourceOver的描述,可以知道此时目标和源重叠的部分进行混合,且源盖住(遮挡住)目标,没有重叠部分各自保留即都绘制出来,结果如下:
将第11行依然设置为Qt::transparent,则如下:

在ImageComposer类的构造函数中,通过本函数分别加载了两张图形,一张用于最左侧QToolButton按钮贴图,一张用于中间QToolButton按钮贴图。
recalculateResult函数分析
函数代码如下:
void ImageComposer::recalculateResult()
{
QPainter::CompositionMode mode = currentMode();
QPainter painter(&resultImage);
painter.setCompositionMode(QPainter::CompositionMode_Source);
painter.fillRect(resultImage.rect()

本文详细分析了Qt中的QPainter::CompositionMode在图像处理中的应用,通过例子解释了不同组合模式下源图像和目标图像的混合效果。通过loadImage函数和recalculateResult函数的代码解析,展示了如何使用QPainter进行图像合成,包括Source、SourceOver、DestinationOver等模式的工作原理。读者可以通过实验不同的组合模式以加深理解。
最低0.47元/天 解锁文章
7146

被折叠的 条评论
为什么被折叠?



