qt 加载 图片旋转_Qt图片预览工具

该博客介绍了如何使用Qt实现图片的预览、加载、缩放、拖拽预览以及图片旋转功能,提供了相应的代码示例和效果展示。
摘要由CSDN通过智能技术生成

f7e13559b57eaec5b0fd4e0a9f2aa425.gif

功能

  1. 图片预览加载
  2. 图片放大缩小预览
  3. 迷你预览框拖拽预览
  4. 图片旋转

效果图

1324907d6927bed31d46280cf2ac5a91.gif

7073f9f3bbb77bbc864ce3e30a9606eb.gif

0b4d616839a6886773ac228f7d458ce8.gif

28cea84ac3cbf037ba2dc45a41b65d9a.gif

代码

QImage ImageViewerTool::loadImage(const QString &fileName)
{
	QImageReader reader(fileName);
	reader.setAutoTransform(true);
	qDebug() << "loading" << QDir::toNativeSeparators(fileName);
	if (!reader.canRead()) {
		qDebug() << QDir::toNativeSeparators(fileName) << ": can't load image";
		return QImage();
	}

	QImage image;
	if (!reader.read(&image)) {
		qDebug() << QDir::toNativeSeparators(fileName) << ": corrupted image: " << reader.errorString();
		return QImage();
	}
	const QSize maximumSize(2000, 2000);
	if (image.size().width() > maximumSize.width() || image.height() > maximumSize.height())
		image = image.scaled(maximumSize, Qt::KeepAspectRatio, Qt::SmoothTransformation);
	return image;
}

void ImageViewerTool::wheelEvent(QWheelEvent *event)
{
	BasicWindow::wheelEvent(event);
	int value = event->delta();
 	double scaleRatio = value * 1.0 / (8 * 360);
 	m_scaleFactor += scaleRatio;
	if (m_scaleFactor >= 5){
		m_scaleFactor = 5;
	}
	else if (m_scaleFactor <= 0.1){
		m_scaleFactor = 0.1;
	}

	if (m_scaleFactor > 1){
		m_miniLabel->setVisible(true);
	}
	else{
		m_viewPos = QPointF(0, 0);
		m_miniLabel->setVisible(false);
	}
	m_miniLabel->setViewScaleFactor(m_scaleFactor);
}

void ImageViewerTool::paintEvent(QPaintEvent* event)
{
	BasicWindow::paintEvent(event);
	QPainter painter(this);
	painter.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform);
	painter.setPen(Qt::NoPen);
	QPainterPath clippath;
	clippath.addRoundedRect(this->rect(), 4.5, 4.5);
	painter.setClipPath(clippath);
	//drawback
	drawBack(&painter);
	//drawImage
	const qreal iw = m_currentImage.width();
	const qreal ih = m_currentImage.height();
	const qreal wh = height();
	const qreal ww = width();

	painter.save();
	qreal scaleX = m_imageScaleSize.width() * m_scaleFactor / iw;
	qreal scaleY = m_imageScaleSize.height() * m_scaleFactor / ih;
	if (m_scaleFactor > 1){
		painter.translate(m_viewPos.x() * m_scaleFactor - (ww - iw * scaleX) / 2, m_viewPos.y() * m_scaleFactor - (wh - ih * scaleY) / 2);
	}
	painter.translate(ww / 2, wh / 2);
	painter.rotate(m_rotationAngle);
	painter.scale(scaleX, scaleY);
	painter.translate(-iw / 2, -ih / 2);
	painter.drawImage(0, 0, m_currentImage);
	painter.restore();

	if (m_isShowFactor != m_scaleFactor){
		m_isShowFactor = m_scaleFactor;
		m_factorTimer->start(1000);
		int number = m_scaleFactor * 100;
		QPoint point = QPoint(this->width() / 2 - 50, this->height() / 2 - 25);
		painter.save();
		QRect scaleRect = QRect(point, QSize(100, 50));
		m_spliterImage->draw(&painter, scaleRect, 255);
		QFont font = painter.font();
		font.setFamily("Microsoft YaHei");
		font.setPixelSize(14);
		painter.setFont(font);
		painter.setPen(QColor(255, 255, 255, 200));
		painter.setBrush(Qt::NoBrush);
		painter.drawText(scaleRect, Qt::AlignCenter, QString("%1%").arg(number));
		painter.restore();
		painter.drawPixmap(point, QPixmap());
	}
}

void ImageViewerTool::setRotationImage(int rotationAngle)
{
	m_rotationAngle = rotationAngle;
	update();
}

void ImageViewerTool::setImageView(QPointF pos, QSizeF size)
{
	m_viewPos = -pos;
	update();
}
void ViewImageMiniLabel::paintEvent(QPaintEvent* event)
{
	QLabel::paintEvent(event);
	QPainter painter(this);
	painter.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform);
	painter.setPen(Qt::NoPen);
	QPainterPath clippath;
	clippath.addRoundedRect(this->rect(), 4.5, 4.5);
	painter.setClipPath(clippath);
	//drawback
	painter.save();
	painter.setBrush(QColor(52, 52, 52, 220));
	painter.drawRect(this->rect());
	painter.restore();
	//drawImage
	const qreal iw = m_image.width();
	const qreal ih = m_image.height();
	const qreal wh = height();
	const qreal ww = width();

	painter.save();
	painter.translate(ww / 2, wh / 2);
	painter.rotate(m_rotationAngle);
	painter.scale(m_imageScaleSize.width() * 1.0 / iw, m_imageScaleSize.height() * 1.0 / ih);
	painter.translate(-iw / 2, -ih / 2);
	painter.drawImage(0, 0, m_image);
	painter.restore();

	if (m_viewSize.width() < this->size().width() || m_viewSize.height() < this->size().height()){
		painter.save();
		painter.setPen(Qt::red);
		painter.setBrush(Qt::NoBrush);
		painter.drawRoundedRect(QRectF(m_viewPos, m_viewSize), 4.5, 4.5);
		painter.restore();
	}
}

void ViewImageMiniLabel::mouseReleaseEvent(QMouseEvent *event)
{
	setCursor(Qt::PointingHandCursor);
	m_mousepressPos = event->globalPos();
	m_leftButtonPress = false;
}

void ViewImageMiniLabel::mouseMoveEvent(QMouseEvent *event)
{
	if (m_leftButtonPress) {
		QPoint p = event->globalPos();
		int offsetx = p.x() - m_mousepressPos.x();
		int offsety = p.y() - m_mousepressPos.y();
		if ((offsetx > -1 && offsetx < 1) && (offsety > -1 && offsety < 1))
			return;
		m_mousepressPos = p;

		qreal x = m_viewPos.x() + offsetx;
		qreal y = m_viewPos.y() + offsety;
		if (x + m_viewSize.width() > this->width()){
			x = this->width() - m_viewSize.width();
		}
		else if (x < 0){
			x = 0;
		}

		if (y + m_viewSize.height() > this->height()){
			y = this->height() - m_viewSize.height();
		}
		else if (y < 0){
			y = 0;
		}
		m_viewPos.setX(x);
		m_viewPos.setY(y);

		setViewImageUpdate(m_viewPos);
	}
}

void ViewImageMiniLabel::setViewImageUpdate(QPointF ponit)
{
	QPointF newpoint;
	qreal scaleX = m_imageScaleSize.width() * 1.0 / m_image.width();
	qreal scaleY = m_imageScaleSize.height() * 1.0 / m_image.height();
	newpoint.rx() = ponit.x() - (this->width() - m_image.width() * scaleX) / 2;
	newpoint.ry() = ponit.y() - (this->height() - m_image.height() * scaleY) / 2;
	m_imageView->setImageView(newpoint * 4.0, m_viewSize * 4.0);
	update();
}

void ViewImageMiniLabel::mousePressEvent(QMouseEvent *event)
{
	if (event->button() == Qt::LeftButton) {
		setCursor(Qt::ClosedHandCursor);
		m_leftButtonPress = true;
	}
	m_mousepressPos = event->globalPos();
}

void ViewImageMiniLabel::setViewScaleFactor(qreal factor)
{
	m_viewSize = this->size() * 1.0 / factor;
	if (m_viewSize.width() > this->size().width()){
		m_viewSize.rwidth() = this->size().width();
	}
	else if (m_viewSize.height() > this->size().height()){
		m_viewSize.rheight() = this->size().height();
	}

	if (m_viewPos.x() + m_viewSize.width() > this->width()){
		m_viewPos.rx() = this->width() - m_viewSize.width();
	}
	else if (m_viewPos.x() < 0){
		m_viewPos.rx() = 0;
	}

	if (m_viewPos.y() + m_viewSize.height() > this->height()){
		m_viewPos.ry() = this->height() - m_viewSize.height();
	}
	else if (m_viewPos.y() < 0){
		m_viewPos.ry() = 0;
	}
	setViewImageUpdate(m_viewPos);
}

void ViewImageMiniLabel::mouseDoubleClickEvent(QMouseEvent *event)
{
	if (m_animationRotation == nullptr){
		m_animationRotation = new QPropertyAnimation(this, "");
		connect(m_animationRotation, &QVariantAnimation::valueChanged, [=](const QVariant &value){
			m_rotationAngle = value.toInt();
			m_imageView->setRotationImage(m_rotationAngle);
			update();
		});
	}

	int startAngle = m_rotationAngle;
	int endAngle = startAngle + 90;
	m_animationRotation->setDuration(300);
	m_animationRotation->setStartValue(startAngle);
	m_animationRotation->setEndValue(endAngle);
	m_animationRotation->start();
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值