#include "imagecropperdemo.h" #include #include #include #include #include ImageCropperDemo::ImageCropperDemo(QWidget* parent) : QDialog(parent) { setupLayout(); init(); this->setAttribute(Qt::WA_DeleteOnClose, true); this->setWindowTitle("Image Cropper Demo"); } void ImageCropperDemo::setupLayout() { imgCropperLabel = new ImageCropperLabel(600, 500, this); imgCropperLabel->setFrameStyle(1); comboOutputShape = new QComboBox(this); comboCropperShape = new QComboBox(this); labelPreviewImage = new QLabel(this); editOriginalImagePath = new QLineEdit(this); btnChooseOriginalImagePath = new QPushButton(this); QHBoxLayout* hOriginalImagePathLayout = new QHBoxLayout(); hOriginalImagePathLayout->addWidget(editOriginalImagePath); hOriginalImagePathLayout->addWidget(btnChooseOriginalImagePath); editCropperFixedWidth = new QLineEdit(this); editCropperFixedHeight = new QLineEdit(this); QHBoxLayout* hCropperFixedSizeLayout = new QHBoxLayout(); hCropperFixedSizeLayout->addWidget(editCropperFixedWidth); hCropperFixedSizeLayout->addWidget(editCropperFixedHeight); editCropperMinWidth = new QLineEdit("8", this); editCropperMinHeight = new QLineEdit("8", this); QHBoxLayout* hCropperMinSizeLayout = new QHBoxLayout(); hCropperMinSizeLayout->addWidget(editCropperMinWidth); hCropperMinSizeLayout->addWidget(editCropperMinHeight); checkEnableOpacity = new QCheckBox(this); sliderOpacity = new QSlider(Qt::Horizontal, this); checkShowDragSquare = new QCheckBox(this); editDragSquareEdge = new QLineEdit("8", this); checkShowRectBorder = new QCheckBox(this); labelRectBorderColor = new QLabel(this); btnChooseRectBorderCorlor = new QPushButton(this); QHBoxLayout* hRectBorderColorLayout = new QHBoxLayout(); hRectBorderColorLayout->addWidget(labelRectBorderColor); hRectBorderColorLayout->addWidget(btnChooseRectBorderCorlor); labelDragSquareColor = new QLabel(this); btnChooseDragSquareColor = new QPushButton(this); QHBoxLayout* hDragSquareColorLayout = new QHBoxLayout(); hDragSquareColorLayout->addWidget(labelDragSquareColor); hDragSquareColorLayout->addWidget(btnChooseDragSquareColor); QFormLayout* formLayout1 = new QFormLayout(); formLayout1->addRow(new QLabel("Preview:"), labelPreviewImage); formLayout1->addRow(new QLabel("OriginalImage:", this), hOriginalImagePathLayout); formLayout1->addRow(new QLabel("OutputShape:", this), comboOutputShape); formLayout1->addRow(new QLabel("CropperShape:", this), comboCropperShape); formLayout1->addRow(new QLabel("FixedSize:", this), hCropperFixedSizeLayout); formLayout1->addRow(new QLabel("MinimumSize:", this), hCropperMinSizeLayout); QFormLayout* formLayout2 = new QFormLayout(); formLayout2->addRow(new QLabel("EnableOpacity:", this), checkEnableOpacity); formLayout2->addRow(new QLabel("Opacity:", this), sliderOpacity); QFormLayout* formLayout3 = new QFormLayout(); formLayout3->addRow(new QLabel("ShowDragSquare:", this), checkShowDragSquare); formLayout3->addRow(new QLabel("DragSquareEdge:", this), editDragSquareEdge); formLayout3->addRow(new QLabel("DragSquareColor:", this), hDragSquareColorLayout); QFormLayout* formLayout4 = new QFormLayout(); formLayout4->addRow(new QLabel("ShowRectBorder:", this), checkShowRectBorder); formLayout4->addRow(new QLabel("RectBorderColor:", this), hRectBorderColorLayout); btnSavePreview = new QPushButton("Save", this); btnQuit = new QPushButton("Quit", this); QHBoxLayout* btnLayout = new QHBoxLayout(); btnLayout->addStretch(); btnLayout->addWidget(btnSavePreview); btnLayout->addStretch(); btnLayout->addWidget(btnQuit); btnLayout->addStretch(); QVBoxLayout* vLayout = new QVBoxLayout(); vLayout->addLayout(formLayout1); vLayout->addStretch(); vLayout->addLayout(formLayout2); vLayout->addStretch(); vLayout->addLayout(formLayout3); vLayout->addStretch(); vLayout->addLayout(formLayout4); vLayout->addStretch(); vLayout->addLayout(btnLayout); mainLayout = new QHBoxLayout(this); mainLayout->addWidget(imgCropperLabel); mainLayout->addLayout(vLayout); } void ImageCropperDemo::init() { imgCropperLabel->setRectCropper(); editCropperFixedWidth->setEnabled(false); editCropperFixedHeight->setEnabled(false); labelPreviewImage->setFixedSize(96, 96); labelPreviewImage->setAlignment(Qt::AlignCenter); labelPreviewImage->setFrameStyle(QFrame::Panel | QFrame::Sunken); connect(imgCropperLabel, &ImageCropperLabel::croppedImageChanged, this, &ImageCropperDemo::onUpdatePreview); btnChooseOriginalImagePath->setIcon(QIcon("res/select-file.ico")); btnChooseOriginalImagePath->setFixedWidth(30); connect(btnChooseOriginalImagePath, &QPushButton::clicked, this, &ImageCropperDemo::onChooseOriginalImage); comboOutputShape->addItem("Rect/Square"); comboOutputShape->addItem("Ellipse/Circle"); connect(comboOutputShape, SIGNAL(currentIndexChanged(int)), this, SLOT(onOutputShapeChanged(int))); comboCropperShape->addItem("Rect"); comboCropperShape->addItem("Square"); comboCropperShape->addItem("FixedRect"); comboCropperShape->addItem("Ellipse"); comboCropperShape->addItem("Circle"); comboCropperShape->addItem("FixedEllipse"); connect(comboCropperShape, SIGNAL(currentIndexChanged(int)), this, SLOT(onCropperShapeChanged(int))); connect(editCropperFixedWidth, &QLineEdit::textChanged, this, &ImageCropperDemo::onFixedWidthChanged); connect(editCropperFixedHeight, &QLineEdit::textChanged, this, &ImageCropperDemo::onFixedHeightChanged); connect(editCropperMinWidth, &QLineEdit::textChanged, this, &ImageCropperDemo::onMinWidthChanged); connect(editCropperMinHeight, &QLineEdit::textChanged, this, &ImageCropperDemo::onMinHeightChanged); checkEnableOpacity->setCheckState(Qt::Checked); imgCropperLabel->enableOpacity(true); connect(checkEnableOpacity, &QCheckBox::stateChanged, this, &ImageCropperDemo::onEnableOpacityChanged); checkShowDragSquare->setCheckState(Qt::Checked); imgCropperLabel->setShowDragSquare(true); connect(checkShowDragSquare, &QCheckBox::stateChanged, this, &ImageCropperDemo::onShowDragSquareChanged); connect(editDragSquareEdge, &QLineEdit::textChanged, this, &ImageCropperDemo::onDragSquareEdgeChanged); sliderOpacity->setRange(0, 100); sliderOpacity->setValue(60); connect(sliderOpacity, &QSlider::valueChanged, this, &ImageCropperDemo::onOpacityChanged); checkShowRectBorder->setCheckState(Qt::Checked); connect(checkShowRectBorder, &QCheckBox::stateChanged, this, &ImageCropperDemo::onShowRectBorder); setLabelColor(labelRectBorderColor, Qt::white); btnChooseRectBorderCorlor->setIcon(QIcon("res/color-palette.ico")); btnChooseRectBorderCorlor->setFixedWidth(40); connect(btnChooseRectBorderCorlor, &QPushButton::clicked, this, &ImageCropperDemo::onChooseRectBorderColor); setLabelColor(labelDragSquareColor, Qt::white); btnChooseDragSquareColor->setIcon(QIcon("res/color-palette.ico")); btnChooseDragSquareColor->setFixedWidth(40); connect(btnChooseDragSquareColor, &QPushButton::clicked, this, &ImageCropperDemo::onChooseDragSquareColor); connect(btnSavePreview, &QPushButton::clicked, this, &ImageCropperDemo::onSaveCroppedImage); connect(btnQuit, &QPushButton::clicked, this, &ImageCropperDemo::close); imgCropperLabel->update(); } /***************************************************************************** * * slots * *****************************************************************************/ void ImageCropperDemo::onChooseOriginalImage() { QString filename = QFileDialog::getOpenFileName(this, "Select a picture", "", "picture (*.jpg *.png *.bmp)"); if (filename.isNull()) return; QPixmap pixmap; if (!pixmap.load(filename)) { QMessageBox::critical(this, "Error", "Load image failed", QMessageBox::Ok); return; } editOriginalImagePath->setText(filename); imgCropperLabel->setOriginalImage(pixmap); imgCropperLabel->update(); onUpdatePreview(); labelPreviewImage->setFrameStyle(0); } void ImageCropperDemo::onOutputShapeChanged(int idx) { // Output: Rectangular if (idx == 0) imgCropperLabel->setOutputShape(OutputShape::RECT); else imgCropperLabel->setOutputShape(OutputShape::ELLIPSE); onUpdatePreview(); } void ImageCropperDemo::onCropperShapeChanged(int idx) { switch (CropperShape(idx + 1)) { case CropperShape::RECT: { imgCropperLabel->setRectCropper(); editCropperFixedWidth->setEnabled(false); editCropperFixedHeight->setEnabled(false); editCropperMinWidth->setEnabled(true); editCropperMinHeight->setEnabled(true); checkShowDragSquare->setEnabled(true); editDragSquareEdge->setEnabled(true); btnChooseDragSquareColor->setEnabled(true); break; } case CropperShape::SQUARE: { imgCropperLabel->setSquareCropper(); editCropperFixedWidth->setEnabled(false); editCropperFixedHeight->setEnabled(false); editCropperMinWidth->setEnabled(true); editCropperMinHeight->setEnabled(true); checkShowDragSquare->setEnabled(true); editDragSquareEdge->setEnabled(true); btnChooseDragSquareColor->setEnabled(true); break; } case CropperShape::FIXED_RECT: { imgCropperLabel->setFixedRectCropper(QSize(64, 64)); editCropperFixedWidth->setEnabled(true); editCropperFixedHeight->setEnabled(true); editCropperMinWidth->setEnabled(false); editCropperMinHeight->setEnabled(false); editCropperFixedWidth->setText("64"); editCropperFixedHeight->setText("64"); checkShowDragSquare->setEnabled(false); editDragSquareEdge->setEnabled(false); btnChooseDragSquareColor->setEnabled(false); break; } case CropperShape::ELLIPSE: { imgCropperLabel->setEllipseCropper(); editCropperFixedWidth->setEnabled(false); editCropperFixedHeight->setEnabled(false); editCropperMinWidth->setEnabled(true); editCropperMinHeight->setEnabled(true); checkShowDragSquare->setEnabled(true); editDragSquareEdge->setEnabled(true); btnChooseDragSquareColor->setEnabled(true); break; } case CropperShape::CIRCLE: { imgCropperLabel->setCircleCropper(); editCropperFixedWidth->setEnabled(false); editCropperFixedHeight->setEnabled(false); editCropperMinWidth->setEnabled(true); editCropperMinHeight->setEnabled(true); checkShowDragSquare->setEnabled(true); editDragSquareEdge->setEnabled(true); btnChooseDragSquareColor->setEnabled(true); break; } case CropperShape::FIXED_ELLIPSE: imgCropperLabel->setFixedEllipseCropper(QSize(64, 64)); editCropperFixedWidth->setEnabled(true); editCropperFixedHeight->setEnabled(true); editCropperMinWidth->setEnabled(false); editCropperMinHeight->setEnabled(false); editCropperFixedWidth->setText("64"); editCropperFixedHeight->setText("64"); checkShowDragSquare->setEnabled(false); editDragSquareEdge->setEnabled(false); btnChooseDragSquareColor->setEnabled(false); break; case CropperShape::UNDEFINED: break; } imgCropperLabel->update(); onUpdatePreview(); } void ImageCropperDemo::onEnableOpacityChanged(int state) { if (state == Qt::Checked) { sliderOpacity->setEnabled(true); imgCropperLabel->enableOpacity(true); } else { sliderOpacity->setEnabled(false); imgCropperLabel->enableOpacity(false); } imgCropperLabel->update(); } void ImageCropperDemo::onShowDragSquareChanged(int state) { if (state == Qt::Checked) { editDragSquareEdge->setEnabled(true); btnChooseDragSquareColor->setEnabled(true); imgCropperLabel->setShowDragSquare(true); } else { editDragSquareEdge->setEnabled(false); btnChooseDragSquareColor->setEnabled(false); imgCropperLabel->setShowDragSquare(false); } imgCropperLabel->update(); } void ImageCropperDemo::onDragSquareEdgeChanged(QString edge) { imgCropperLabel->setDragSquareEdge(edge.toInt()); imgCropperLabel->update(); } void ImageCropperDemo::onOpacityChanged(int val) { imgCropperLabel->setOpacity(val / 100.0); imgCropperLabel->update(); } void ImageCropperDemo::onFixedWidthChanged(QString width) { imgCropperLabel->setCropperFixedWidth(width.toInt()); imgCropperLabel->update(); } void ImageCropperDemo::onFixedHeightChanged(QString height) { imgCropperLabel->setCropperFixedHeight(height.toInt()); imgCropperLabel->update(); } void ImageCropperDemo::onMinWidthChanged(QString width) { imgCropperLabel->setCropperMinimumWidth(width.toInt()); imgCropperLabel->update(); } void ImageCropperDemo::onMinHeightChanged(QString height) { imgCropperLabel->setMinimumHeight(height.toInt()); imgCropperLabel->update(); } void ImageCropperDemo::onShowRectBorder(int state) { if (state == Qt::Checked) { btnChooseRectBorderCorlor->setEnabled(true); imgCropperLabel->setShowRectBorder(true); } else { btnChooseRectBorderCorlor->setEnabled(false); imgCropperLabel->setShowRectBorder(false); } imgCropperLabel->update(); } void ImageCropperDemo::onChooseRectBorderColor() { QColor color = QColorDialog::getColor(imgCropperLabel->getBorderPen().color(), this); if (color.isValid()) { setLabelColor(labelRectBorderColor, color); QPen pen = imgCropperLabel->getBorderPen(); pen.setColor(color); imgCropperLabel->setBorderPen(pen); imgCropperLabel->update(); } } void ImageCropperDemo::onChooseDragSquareColor() { QColor color = QColorDialog::getColor(Qt::white, this); if (color.isValid()) { setLabelColor(labelDragSquareColor, color); imgCropperLabel->setDragSquareColor(color); imgCropperLabel->update(); } } void ImageCropperDemo::onUpdatePreview() { QPixmap preview = imgCropperLabel->getCroppedImage(); preview = preview.scaled(labelPreviewImage->width(), labelPreviewImage->height(), Qt::KeepAspectRatio, Qt::SmoothTransformation); labelPreviewImage->setPixmap(preview); } void ImageCropperDemo::onSaveCroppedImage() { const QPixmap* pixmap = labelPreviewImage->pixmap(); if (!pixmap) { QMessageBox::information(this, "Error", "There is no cropped image to save.", QMessageBox::Ok); return ; } QString filename = QFileDialog::getSaveFileName(this, "Save cropped image", "", "picture (*.png)"); if (!filename.isNull()) { if (imgCropperLabel->getCroppedImage().save(filename, "PNG")) QMessageBox::information(this, "Prompt", "Saved successfully", QMessageBox::Ok); else QMessageBox::information(this, "Error", "Save image failed!", QMessageBox::Ok); } }