You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
161 lines
3.8 KiB
C++
161 lines
3.8 KiB
C++
|
5 years ago
|
#include "lpImgViewer.h"
|
||
|
|
#include <QResizeEvent>
|
||
|
|
#include <QWheelEvent>
|
||
|
|
#include <QRectF>
|
||
|
|
#include <iostream>
|
||
|
|
#include <QtDebug>
|
||
|
|
|
||
|
|
lpImgViewer::lpImgViewer(QWidget* parent /*= 0*/)
|
||
|
|
: QGraphicsView(parent), mpImgItem(NULL), mpInfoLabel(NULL), mpImg(NULL)
|
||
|
|
{
|
||
|
|
lpScene = new QGraphicsScene(parent);
|
||
|
|
setScene(lpScene);
|
||
|
|
setResizeAnchor(QGraphicsView::AnchorUnderMouse);
|
||
|
|
setTransformationAnchor(QGraphicsView::AnchorUnderMouse);
|
||
|
|
}
|
||
|
|
|
||
|
|
lpImgViewer::lpImgViewer(QGraphicsScene *scene, QWidget *parent /*= 0*/)
|
||
|
|
: QGraphicsView(scene, parent), mpImgItem(NULL), mpInfoLabel(NULL), mpImg(NULL)
|
||
|
|
{
|
||
|
|
setResizeAnchor(QGraphicsView::AnchorUnderMouse);
|
||
|
|
setTransformationAnchor(QGraphicsView::AnchorUnderMouse);
|
||
|
|
}
|
||
|
|
|
||
|
|
QGraphicsPixmapItem* lpImgViewer::setImg(QImage& img)
|
||
|
|
{
|
||
|
|
if (mpImg)
|
||
|
|
delete mpImg;
|
||
|
|
mpImg = new QImage(img);
|
||
|
|
|
||
|
|
if (!mpImgItem)
|
||
|
|
mpImgItem = scene()->addPixmap(QPixmap::fromImage(img));
|
||
|
|
else
|
||
|
|
mpImgItem->setPixmap(QPixmap::fromImage(img));
|
||
|
|
|
||
|
|
mpImgItem->setOffset(-img.width() / 2.0, -img.height() / 2.0);
|
||
|
|
mpImgItem->setPos(0, 0);
|
||
|
|
|
||
|
|
mImgOriSize = img.size();
|
||
|
|
qreal scale = std::min((qreal)size().width() / img.width(), (qreal)size().height() / img.height());
|
||
|
|
scaleImg2(scale);
|
||
|
|
mpImgItem->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable);
|
||
|
|
|
||
|
|
this->centerOn(0, 0);
|
||
|
|
|
||
|
|
return mpImgItem;
|
||
|
|
}
|
||
|
|
|
||
|
|
void lpImgViewer::wheelEvent(QWheelEvent *evt)
|
||
|
|
{
|
||
|
|
if (mpImgItem)
|
||
|
|
{
|
||
|
|
qreal numDegrees = evt->angleDelta().y() / 120;
|
||
|
|
|
||
|
|
qreal newScale = transform().m11();
|
||
|
|
if (numDegrees > 0)
|
||
|
|
newScale *= std::pow(1.1, numDegrees);
|
||
|
|
else if (numDegrees < 0)
|
||
|
|
newScale *= std::pow(0.9, -numDegrees);
|
||
|
|
|
||
|
|
qreal minScale = std::min((qreal)size().width() / mImgOriSize.width(), (qreal)size().height() / mImgOriSize.height());
|
||
|
|
mpImgItem->setTransformOriginPoint(0, 0);
|
||
|
|
scaleImg2(newScale);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
void lpImgViewer::mouseMoveEvent(QMouseEvent *evt)
|
||
|
|
{
|
||
|
|
if (mpImgItem)
|
||
|
|
{
|
||
|
|
QPoint curpos = (mpImgItem->mapFromScene(this->mapToScene(evt->pos())) +
|
||
|
|
QPointF(mImgOriSize.width() / 2.0, mImgOriSize.height() / 2.0) + QPointF(-0.5, -0.5)).toPoint();
|
||
|
|
|
||
|
|
if (mpInfoLabel)
|
||
|
|
selectPixel(curpos);
|
||
|
|
else
|
||
|
|
emit pixelSelected(curpos);
|
||
|
|
}
|
||
|
|
|
||
|
|
if (mpImgItem && mpImgItem->isSelected())
|
||
|
|
{
|
||
|
|
QPointF pos = mpImgItem->scenePos();
|
||
|
|
qDebug() << pos;
|
||
|
|
emit imgMoved(pos);
|
||
|
|
}
|
||
|
|
|
||
|
|
QGraphicsView::mouseMoveEvent(evt);
|
||
|
|
}
|
||
|
|
|
||
|
|
void lpImgViewer::resizeEvent(QResizeEvent* evt)
|
||
|
|
{
|
||
|
|
QGraphicsView::resizeEvent(evt);
|
||
|
|
}
|
||
|
|
|
||
|
|
void lpImgViewer::mouseReleaseEvent(QMouseEvent *evt)
|
||
|
|
{
|
||
|
|
QGraphicsView::mouseReleaseEvent(evt);
|
||
|
|
if (mpImgItem)
|
||
|
|
mpImgItem->setSelected(false);
|
||
|
|
}
|
||
|
|
|
||
|
|
void lpImgViewer::closeEvent(QCloseEvent *evt)
|
||
|
|
{
|
||
|
|
deleteLater();
|
||
|
|
}
|
||
|
|
|
||
|
|
void lpImgViewer::moveImg(QPointF pos)
|
||
|
|
{
|
||
|
|
if (mpImgItem)
|
||
|
|
mpImgItem->setPos(pos);
|
||
|
|
}
|
||
|
|
|
||
|
|
void lpImgViewer::selectPixel(QPoint pos)
|
||
|
|
{
|
||
|
|
if (pos.x() < 0 || pos.y() < 0 || pos.x() > mImgOriSize.width() || pos.y() > mImgOriSize.height())
|
||
|
|
{
|
||
|
|
mpInfoLabel->setText(QString("out of image..."));
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
if (!mpImg) {
|
||
|
|
mpInfoLabel->setText(QString("mpImg is null"));
|
||
|
|
}
|
||
|
|
QRgb pixel = mpImg->pixel(pos);
|
||
|
|
QColor rgb(pixel);
|
||
|
|
QColor hsv = rgb.toHsv();
|
||
|
|
QString infoStr("Position:[%1, %2] Color(RGB):[%3, %4, %5] (HSV):[%6, %7, %8]");
|
||
|
|
infoStr = infoStr.arg(pos.x()).arg(pos.y())
|
||
|
|
.arg(rgb.red()).arg(rgb.green()).arg(rgb.blue())
|
||
|
|
.arg(hsv.hue()/2).arg(hsv.saturation()).arg(hsv.value());
|
||
|
|
mpInfoLabel->setText(infoStr);
|
||
|
|
}
|
||
|
|
|
||
|
|
void lpImgViewer::scaleImg(QTransform tf, QPointF center)
|
||
|
|
{
|
||
|
|
this->resetTransform();
|
||
|
|
this->setTransform(tf);
|
||
|
|
this->centerOn(center);
|
||
|
|
}
|
||
|
|
|
||
|
|
void lpImgViewer::scaleImg2(qreal scale)
|
||
|
|
{
|
||
|
|
QTransform t;
|
||
|
|
t.scale(scale, scale);
|
||
|
|
this->setTransform(t);
|
||
|
|
|
||
|
|
QPointF center = this->mapToScene(width()/2, height()/2);
|
||
|
|
|
||
|
|
emit imgScaled(this->transform(), center);
|
||
|
|
}
|
||
|
|
|
||
|
|
void lpImgViewer::clear()
|
||
|
|
{
|
||
|
|
scene()->clear();
|
||
|
|
mpImgItem = NULL;
|
||
|
|
|
||
|
|
if (mpImg)
|
||
|
|
{
|
||
|
|
delete mpImg;
|
||
|
|
mpImg = NULL;
|
||
|
|
}
|
||
|
|
}
|