169 lines
5.2 KiB
C++
169 lines
5.2 KiB
C++
#ifndef IMAGECROPPERLABEL_H
|
|
#define IMAGECROPPERLABEL_H
|
|
|
|
#include <QLabel>
|
|
#include <QPixmap>
|
|
#include <QPen>
|
|
|
|
enum class CropperShape {
|
|
UNDEFINED = 0,
|
|
RECT = 1,
|
|
SQUARE = 2,
|
|
FIXED_RECT = 3,
|
|
ELLIPSE = 4,
|
|
CIRCLE = 5,
|
|
FIXED_ELLIPSE = 6
|
|
};
|
|
|
|
enum class OutputShape {
|
|
RECT = 0,
|
|
ELLIPSE = 1
|
|
};
|
|
|
|
enum class SizeType {
|
|
fixedSize = 0,
|
|
fitToMaxWidth = 1,
|
|
fitToMaxHeight = 2,
|
|
fitToMaxWidthHeight = 3,
|
|
};
|
|
|
|
class ImageCropperLabel : public QLabel
|
|
{
|
|
Q_OBJECT
|
|
public:
|
|
ImageCropperLabel(int width, int height, QWidget *parent);
|
|
|
|
void setOriginalImage(const QPixmap &pixmap);
|
|
void setOutputShape(OutputShape shape) { outputShape = shape; }
|
|
QPixmap getCroppedImage();
|
|
QPixmap getCroppedImage(OutputShape shape);
|
|
|
|
/*****************************************
|
|
* Set cropper's shape
|
|
*****************************************/
|
|
void setRectCropper();
|
|
void setSquareCropper();
|
|
void setEllipseCropper();
|
|
void setCircleCropper();
|
|
void setFixedRectCropper(QSize size);
|
|
void setFixedEllipseCropper(QSize size);
|
|
void setCropper(CropperShape shape, QSize size); // not recommended
|
|
|
|
/*****************************************************************************
|
|
* Set cropper's fixed size
|
|
*****************************************************************************/
|
|
void setCropperFixedSize(int fixedWidth, int fixedHeight);
|
|
void setCropperFixedWidth(int fixedWidht);
|
|
void setCropperFixedHeight(int fixedHeight);
|
|
|
|
/*****************************************************************************
|
|
* Set cropper's minimum size
|
|
* default: the twice of minimum of the edge lenght of drag square
|
|
*****************************************************************************/
|
|
void setCropperMinimumSize(int minWidth, int minHeight)
|
|
{
|
|
cropperMinimumWidth = minWidth;
|
|
cropperMinimumHeight = minHeight;
|
|
}
|
|
void setCropperMinimumWidth(int minWidth) { cropperMinimumWidth = minWidth; }
|
|
void setCropperMinimumHeight(int minHeight) { cropperMinimumHeight = minHeight; }
|
|
|
|
/*************************************************
|
|
* Set the size, color, visibility of rectangular border
|
|
*************************************************/
|
|
void setShowRectBorder(bool show) { isShowRectBorder = show; }
|
|
QPen getBorderPen() { return borderPen; }
|
|
void setBorderPen(const QPen &pen) { borderPen = pen; }
|
|
|
|
/*************************************************
|
|
* Set the size, color of drag square
|
|
*************************************************/
|
|
void setShowDragSquare(bool show) { isShowDragSquare = show; }
|
|
void setDragSquareEdge(int edge) { dragSquareEdge = (edge >= 3 ? edge : 3); }
|
|
void setDragSquareColor(const QColor &color) { dragSquareColor = color; }
|
|
|
|
/*****************************************
|
|
* Opacity Effect
|
|
*****************************************/
|
|
void enableOpacity(bool b = true) { isShowOpacityEffect = b; }
|
|
void setOpacity(double newOpacity) { opacity = newOpacity; }
|
|
|
|
signals:
|
|
void croppedImageChanged();
|
|
|
|
protected:
|
|
/*****************************************
|
|
* Event
|
|
*****************************************/
|
|
virtual void paintEvent(QPaintEvent *event) override;
|
|
virtual void mousePressEvent(QMouseEvent *e) override;
|
|
virtual void mouseMoveEvent(QMouseEvent *e) override;
|
|
virtual void mouseReleaseEvent(QMouseEvent *e) override;
|
|
|
|
private:
|
|
/***************************************
|
|
* Draw shapes
|
|
***************************************/
|
|
void drawFillRect(QPoint centralPoint, int edge, QColor color);
|
|
void drawRectOpacity();
|
|
void drawEllipseOpacity();
|
|
void drawOpacity(const QPainterPath &path); // shadow effect
|
|
void drawSquareEdge(bool onlyFourCorners);
|
|
|
|
/***************************************
|
|
* Other utility methods
|
|
***************************************/
|
|
int getPosInCropperRect(const QPoint &pt);
|
|
bool isPosNearDragSquare(const QPoint &pt1, const QPoint &pt2);
|
|
void resetCropperPos();
|
|
void changeCursor();
|
|
|
|
enum {
|
|
RECT_OUTSIZD = 0,
|
|
RECT_INSIDE = 1,
|
|
RECT_TOP_LEFT,
|
|
RECT_TOP,
|
|
RECT_TOP_RIGHT,
|
|
RECT_RIGHT,
|
|
RECT_BOTTOM_RIGHT,
|
|
RECT_BOTTOM,
|
|
RECT_BOTTOM_LEFT,
|
|
RECT_LEFT
|
|
};
|
|
|
|
const bool ONLY_FOUR_CORNERS = true;
|
|
|
|
private:
|
|
QPixmap originalImage;
|
|
QPixmap tempImage;
|
|
|
|
bool isShowRectBorder = true;
|
|
QPen borderPen;
|
|
|
|
CropperShape cropperShape = CropperShape::UNDEFINED;
|
|
OutputShape outputShape = OutputShape::RECT;
|
|
|
|
QRect imageRect; // the whole image area in the label (not real size)
|
|
QRect cropperRect; // a rectangle frame to choose image area (not real size)
|
|
QRect cropperRect_; // cropper rect (real size)
|
|
double scaledRate = 1.0;
|
|
|
|
bool isLButtonPressed = false;
|
|
bool isCursorPosCalculated = false;
|
|
int cursorPosInCropperRect = RECT_OUTSIZD;
|
|
QPoint lastPos;
|
|
QPoint currPos;
|
|
|
|
bool isShowDragSquare = true;
|
|
int dragSquareEdge = 8;
|
|
QColor dragSquareColor = Qt::white;
|
|
|
|
int cropperMinimumWidth = dragSquareEdge * 2;
|
|
int cropperMinimumHeight = dragSquareEdge * 2;
|
|
|
|
bool isShowOpacityEffect = false;
|
|
double opacity = 0.6;
|
|
};
|
|
|
|
#endif // IMAGECROPPERLABEL_H
|