Mega Code Archive

 
Categories / C++ / Qt
 

Image composer

/**************************************************************************** ** ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial Usage ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Commercial License Agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Nokia. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file.  Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain additional ** rights.  These rights are described in the Nokia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file.  Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** If you have questions regarding the use of this file, please contact ** Nokia at qt-info@nokia.com. ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef IMAGECOMPOSER_H #define IMAGECOMPOSER_H #include <QPainter> #include <QWidget> QT_BEGIN_NAMESPACE class QComboBox; class QLabel; class QToolButton; QT_END_NAMESPACE class ImageComposer : public QWidget {     Q_OBJECT public:     ImageComposer(); private slots:     void chooseSource();     void chooseDestination();     void recalculateResult(); private:     void addOp(QPainter::CompositionMode mode, const QString &name);     void chooseImage(const QString &title, QImage *image, QToolButton *button);     void loadImage(const QString &fileName, QImage *image, QToolButton *button);     QPainter::CompositionMode currentMode() const;     QPoint imagePos(const QImage &image) const;     QToolButton *sourceButton;     QToolButton *destinationButton;     QComboBox *operatorComboBox;     QLabel *equalLabel;     QLabel *resultLabel;     QImage sourceImage;     QImage destinationImage;     QImage resultImage; }; #endif #include <QtGui> #include "imagecomposer.h" static const QSize resultSize(200, 200); ImageComposer::ImageComposer() {     sourceButton = new QToolButton;     sourceButton->setIconSize(resultSize);     operatorComboBox = new QComboBox;     addOp(QPainter::CompositionMode_SourceOver, tr("SourceOver"));     addOp(QPainter::CompositionMode_DestinationOver, tr("DestinationOver"));     addOp(QPainter::CompositionMode_Clear, tr("Clear"));     addOp(QPainter::CompositionMode_Source, tr("Source"));     addOp(QPainter::CompositionMode_Destination, tr("Destination"));     addOp(QPainter::CompositionMode_SourceIn, tr("SourceIn"));     addOp(QPainter::CompositionMode_DestinationIn, tr("DestinationIn"));     addOp(QPainter::CompositionMode_SourceOut, tr("SourceOut"));     addOp(QPainter::CompositionMode_DestinationOut, tr("DestinationOut"));     addOp(QPainter::CompositionMode_SourceAtop, tr("SourceAtop"));     addOp(QPainter::CompositionMode_DestinationAtop, tr("DestinationAtop"));     addOp(QPainter::CompositionMode_Xor, tr("Xor"));     addOp(QPainter::CompositionMode_Plus, tr("Plus"));     addOp(QPainter::CompositionMode_Multiply, tr("Multiply"));     addOp(QPainter::CompositionMode_Screen, tr("Screen"));     addOp(QPainter::CompositionMode_Overlay, tr("Overlay"));     addOp(QPainter::CompositionMode_Darken, tr("Darken"));     addOp(QPainter::CompositionMode_Lighten, tr("Lighten"));     addOp(QPainter::CompositionMode_ColorDodge, tr("ColorDodge"));     addOp(QPainter::CompositionMode_ColorBurn, tr("ColorBurn"));     addOp(QPainter::CompositionMode_HardLight, tr("HardLight"));     addOp(QPainter::CompositionMode_SoftLight, tr("SoftLight"));     addOp(QPainter::CompositionMode_Difference, tr("Difference"));     addOp(QPainter::CompositionMode_Exclusion, tr("Exclusion"));     destinationButton = new QToolButton;     destinationButton->setIconSize(resultSize);     equalLabel = new QLabel(tr("="));     resultLabel = new QLabel;     resultLabel->setMinimumWidth(resultSize.width());     connect(sourceButton, SIGNAL(clicked()), this, SLOT(chooseSource()));     connect(operatorComboBox, SIGNAL(activated(int)),             this, SLOT(recalculateResult()));     connect(destinationButton, SIGNAL(clicked()),             this, SLOT(chooseDestination()));     QGridLayout *mainLayout = new QGridLayout;     mainLayout->addWidget(sourceButton, 0, 0, 3, 1);     mainLayout->addWidget(operatorComboBox, 1, 1);     mainLayout->addWidget(destinationButton, 0, 2, 3, 1);     mainLayout->addWidget(equalLabel, 1, 3);     mainLayout->addWidget(resultLabel, 0, 4, 3, 1);     mainLayout->setSizeConstraint(QLayout::SetFixedSize);     setLayout(mainLayout);     resultImage = QImage(resultSize, QImage::Format_ARGB32_Premultiplied);     loadImage(":/images/butterfly.png", &sourceImage, sourceButton);     loadImage(":/images/checker.png", &destinationImage, destinationButton);     setWindowTitle(tr("Image Composition")); } void ImageComposer::chooseSource() {     chooseImage(tr("Choose Source Image"), &sourceImage, sourceButton); } void ImageComposer::chooseDestination() {     chooseImage(tr("Choose Destination Image"), &destinationImage,                 destinationButton); } void ImageComposer::recalculateResult() {     QPainter::CompositionMode mode = currentMode();     QPainter painter(&resultImage);     painter.setCompositionMode(QPainter::CompositionMode_Source);     painter.fillRect(resultImage.rect(), Qt::transparent);     painter.setCompositionMode(QPainter::CompositionMode_SourceOver);     painter.drawImage(0, 0, destinationImage);     painter.setCompositionMode(mode);     painter.drawImage(0, 0, sourceImage);     painter.setCompositionMode(QPainter::CompositionMode_DestinationOver);     painter.fillRect(resultImage.rect(), Qt::white);     painter.end();     resultLabel->setPixmap(QPixmap::fromImage(resultImage)); } void ImageComposer::addOp(QPainter::CompositionMode mode, const QString &name) {     operatorComboBox->addItem(name, mode); } void ImageComposer::chooseImage(const QString &title, QImage *image,                                 QToolButton *button) {     QString fileName = QFileDialog::getOpenFileName(this, title);     if (!fileName.isEmpty())         loadImage(fileName, image, button); } void ImageComposer::loadImage(const QString &fileName, QImage *image,                               QToolButton *button) {     image->load(fileName);     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(); } QPainter::CompositionMode ImageComposer::currentMode() const {     return (QPainter::CompositionMode)            operatorComboBox->itemData(operatorComboBox->currentIndex()).toInt(); } QPoint ImageComposer::imagePos(const QImage &image) const {     return QPoint((resultSize.width() - image.width()) / 2,                   (resultSize.height() - image.height()) / 2); } #include <QApplication> #include "imagecomposer.h" int main(int argc, char *argv[]) {     Q_INIT_RESOURCE(imagecomposition);     QApplication app(argc, argv);     ImageComposer composer;     composer.show();     return app.exec(); }