100 lines
3.2 KiB
C++
100 lines
3.2 KiB
C++
#ifndef IMAGECROPPER_H
|
|
#define IMAGECROPPER_H
|
|
|
|
#include <QWidget>
|
|
#include <QDialog>
|
|
#include <QPainter>
|
|
#include <QLabel>
|
|
#include <QPixmap>
|
|
#include <QString>
|
|
#include <QMessageBox>
|
|
#include <QHBoxLayout>
|
|
#include <QVBoxLayout>
|
|
#include <QPushButton>
|
|
|
|
#include "imagecropperlabel.h"
|
|
|
|
/*******************************************************
|
|
* Loacl private class, which do image-cropping
|
|
* Used in class ImageCropper
|
|
*******************************************************/
|
|
class ImageCropperDialogPrivate : public QDialog {
|
|
Q_OBJECT
|
|
public:
|
|
ImageCropperDialogPrivate(const QPixmap& imageIn, QPixmap& outputImage,
|
|
int windowWidth, int windowHeight,
|
|
CropperShape shape, QSize cropperSize = QSize()) :
|
|
QDialog(nullptr), outputImage(outputImage)
|
|
{
|
|
this->setAttribute(Qt::WA_DeleteOnClose, true);
|
|
this->setWindowTitle("Image Cropper");
|
|
this->setMouseTracking(true);
|
|
this->setModal(true);
|
|
|
|
imageLabel = new ImageCropperLabel(windowWidth, windowHeight, this);
|
|
imageLabel->setCropper(shape, cropperSize);
|
|
imageLabel->setOutputShape(OutputShape::RECT);
|
|
imageLabel->setOriginalImage(imageIn);
|
|
imageLabel->enableOpacity(true);
|
|
|
|
QHBoxLayout* btnLayout = new QHBoxLayout();
|
|
btnOk = new QPushButton("OK", this);
|
|
btnCancel = new QPushButton("Cancel", this);
|
|
btnLayout->addStretch();
|
|
btnLayout->addWidget(btnOk);
|
|
btnLayout->addWidget(btnCancel);
|
|
|
|
QVBoxLayout* mainLayout = new QVBoxLayout(this);
|
|
mainLayout->addWidget(imageLabel);
|
|
mainLayout->addLayout(btnLayout);
|
|
|
|
connect(btnOk, &QPushButton::clicked, this, [this](){
|
|
this->outputImage = this->imageLabel->getCroppedImage();
|
|
this->close();
|
|
});
|
|
connect(btnCancel, &QPushButton::clicked, this, [this](){
|
|
this->outputImage = QPixmap();
|
|
this->close();
|
|
});
|
|
}
|
|
|
|
private:
|
|
ImageCropperLabel* imageLabel;
|
|
QPushButton* btnOk;
|
|
QPushButton* btnCancel;
|
|
QPixmap& outputImage;
|
|
};
|
|
|
|
|
|
/*******************************************************************
|
|
* class ImageCropperDialog
|
|
* create a instane of class ImageCropperDialogPrivate
|
|
* and get cropped image from the instance(after closing)
|
|
********************************************************************/
|
|
class ImageCropperDialog : QObject {
|
|
public:
|
|
static QPixmap getCroppedImage(const QString& filename,int windowWidth, int windowHeight,
|
|
CropperShape cropperShape, QSize crooperSize = QSize())
|
|
{
|
|
QPixmap inputImage;
|
|
QPixmap outputImage;
|
|
|
|
if (!inputImage.load(filename)) {
|
|
QMessageBox::critical(nullptr, "Error", "Load image failed!", QMessageBox::Ok);
|
|
return outputImage;
|
|
}
|
|
|
|
ImageCropperDialogPrivate* imageCropperDo =
|
|
new ImageCropperDialogPrivate(inputImage, outputImage,
|
|
windowWidth, windowHeight,
|
|
cropperShape, crooperSize);
|
|
imageCropperDo->exec();
|
|
|
|
return outputImage;
|
|
}
|
|
};
|
|
|
|
|
|
|
|
#endif // IMAGECROPPER_H
|