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.

249 lines
6.4 KiB
C++

#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), m_scale(1.0), mMinScaleThre(0.01),
mIsFixedSizeScale(false), mFixedSizeScale(1.0), mImgScaleFunc(NULL), mIsAutoResetTransform(false)
{
QGraphicsScene* lpScene = new QGraphicsScene;
setScene(lpScene);
setResizeAnchor(QGraphicsView::AnchorUnderMouse);
setTransformationAnchor(QGraphicsView::AnchorUnderMouse);
}
lpImgViewer::lpImgViewer(QGraphicsScene *scene, QWidget *parent /*= 0*/)
: QGraphicsView(scene, parent), mpImgItem(NULL), mpInfoLabel(NULL), mpImg(NULL), m_scale(1.0),
mIsFixedSizeScale(false), mFixedSizeScale(1.0), mImgScaleFunc(NULL), mIsAutoResetTransform(false)
{
setResizeAnchor(QGraphicsView::AnchorUnderMouse);
setTransformationAnchor(QGraphicsView::AnchorUnderMouse);
}
void lpImgViewer::setInitScale(qreal val)
{
scaleImg2(val);
}
QGraphicsPixmapItem* lpImgViewer::setImg(QImage& img)
{
scene()->setBackgroundBrush(Qt::darkGray);
if (mpImg)
delete mpImg;
mpImg = new QImage(img);
if (!mpImgItem)
{
mpImgItem = scene()->addPixmap(QPixmap::fromImage(img, Qt::NoFormatConversion));
}
else
mpImgItem->setPixmap(QPixmap::fromImage(img, Qt::NoFormatConversion));
QPointF mpos = mpImgItem->pos();
if (mpos.x() == 0 && mpos.y() == 0)
{
mpImgItem->setPos(scene()->width() / 2, scene()->height() / 2);
}
mpImgItem->setOffset(-img.width() / 2.0, -img.height() / 2.0);
scene()->setSceneRect(QRectF(0, 0, img.width(), img.height()));
mImgOriSize = img.size();
mMinScaleThre = 1.0 / std::min(mImgOriSize.width(), mImgOriSize.height());
//qreal scale = std::min((qreal)size().width() / img.width(), (qreal)size().height() / img.height());
if (isAutoResetTransform())
{
mpImgItem->setPos(0, 0);
qreal scale = 1.0f;
scaleImg2(scale);
this->centerOn(0, 0);
}
mpImgItem->setFlags(QGraphicsItem::ItemIsMovable);
return mpImgItem;
}
void lpImgViewer::setResetCenter()
{
if(mpImgItem)
mpImgItem->setPos(scene()->width() /2, scene()->height()/2);
}
void lpImgViewer::wheelEvent(QWheelEvent *evt)
{
if (mpImgItem)
{
qreal numDegrees = evt->angleDelta().y() / 120;
if (!isFixedSizeScale())
{
qreal newScale = transform().m11();
if (numDegrees > 0)
newScale *= std::pow(1.1, numDegrees);
else if (numDegrees < 0)
newScale *= std::pow(0.9, -numDegrees);
mpImgItem->setTransformOriginPoint(0, 0);
scaleImg2(newScale);
emit sgImageScale(newScale);
}
else
{
qreal newScale = fixedSizeScale();
if (numDegrees > 0)
newScale *= std::pow(1.2, numDegrees);
else if (numDegrees < 0)
newScale *= std::pow(0.8, -numDegrees);
if (newScale > 1.0)
newScale = 1.0;
if (newScale < mMinScaleThre)
newScale = mMinScaleThre;
setFixedSizeScale(newScale);
scaleImageWithFixedViewSize();
}
}
}
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)//<2F><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>ֵ
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);
}
QString lpImgViewer::pixelInfoStr(QPoint pos, QRgb _rgb)
{
QColor rgb(_rgb);
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());
return infoStr;
}
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 (!mpImgItem)
{
return;
}
QImage img = mpImgItem->pixmap().toImage();
QRgb pixel = img.pixel(pos);
mpInfoLabel->setText(pixelInfoStr(pos, pixel));
}
void lpImgViewer::scaleImageWithFixedViewSize()
{
if (!mpImg)
{
return;
}
QImage scaledImage;
if (!imgScaleFunc())
{
scaledImage = mpImg->scaled(mpImg->width()*mFixedSizeScale, mpImg->height()*mFixedSizeScale,
Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
mpImgItem->setPixmap(QPixmap::fromImage(scaledImage.scaled(mpImg->width(),
mpImg->height()), Qt::NoFormatConversion));
}
else
{
scaledImage = mImgScaleFunc(*mpImg, mFixedSizeScale, Qt::SmoothTransformation);
mpImgItem->setPixmap(QPixmap::fromImage(mImgScaleFunc(scaledImage,
1.0 / mFixedSizeScale, Qt::FastTransformation), Qt::NoFormatConversion));
}
emit imgScaledWithFixedSize(fixedSizeScale());
}
void lpImgViewer::scaleImg(QTransform tf, QPointF center)
{
this->resetTransform();
this->setTransform(tf);
this->centerOn(center);
}
void lpImgViewer::scaleImg2(qreal scale)
{
if (scale < 0.01)
return;
m_scale = 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()
{
m_scale = 1.0f;
m_channel = "";
scene()->clear();
mpImgItem = NULL;
if (mpImg)
{
delete mpImg;
mpImg = NULL;
}
}