QPainter融合两张图片渲染

2024-04-13 14:38

本文主要是介绍QPainter融合两张图片渲染,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

QPainter融合两张图片渲染


QPainter painter(this);
out = src.copy();
QPainter p(&out);
p.setRenderHint(QPainter::Antialiasing);
p.drawImage(0,0,img);
p.end();
painter.drawImage(0,0,out);
painter.end();

XPS图片编辑器
1.打开存储图片(菜单)
2.画笔和橡皮
3.画笔大小(QSlider)
4.画笔颜色(QColorDialog)

ximage.h


#pragma once
#include <QWidget>
#include <QMouseEvent>
#include <QColor>
#include <QPen>class XImage : public QWidget
{Q_OBJECT
public:XImage(QWidget *parent = nullptr);~XImage();void paintEvent(QPaintEvent *ev);void mouseMoveEvent(QMouseEvent *ev);void mouseReleaseEvent(QMouseEvent *ev);
public slots:void Open();//设置画笔粗细和颜色void setPen(int size,QColor col);//橡皮擦事件void setEraser(int size);//保存void save();
protected://原图QImage src;//输出的图像QImage out;//上一次的鼠标位置QPoint mpos;QPen pen;
};

ximage.cpp


#include "ximage.h"
#include <QPainter>
#include <QFileDialog>XImage::XImage(QWidget *parent):QWidget(parent)
{}XImage::~XImage()
{}void XImage::paintEvent(QPaintEvent *ev)
{QPainter p(this);if(!out.isNull())p.drawImage(0,0,out);
}void XImage::Open()
{//打开图片,用户选择图片QString filename = QFileDialog::getOpenFileName(this,QStringLiteral("打开图片"),"",QStringLiteral("支持的格式(*.png *.jpg &.bmp)"));if(filename.isEmpty()) return;if(!src.load(filename)) return;resize(src.size());mpos = QPoint();out = src.copy();
}   void XImage::mouseMoveEvent(QMouseEvent *ev)
{//绘制到原图中  if(out.isNull()) return;QPainter p(&out);//开启抗拒次p.setRenderHint(QPainter::Antialiasing);p.setPen(pen);if(mpos.isNull()) mpos = ev->pos();p.drawLine(QLine(mpos,ev->pos()));mpos = ev->pos();update();
}void XImage::mouseReleaseEvent(QMouseEvent *ev)
{mpos = QPoint();    
}void XImage::setPen(int size,QColor col)
{pen.setWidth(size);pen.setBrush(col);pen.setCapStyle(Qt::RoundCap);pen.setJoinStyle(Qt::RoundJoin);
}//橡皮擦
void XImage::setEraser(int size)
{pen.setWidth(size);//用原图作画笔pen.setBrush(QBrush(src));
}void XImage::save()
{if(out.isNull()) return;QString filename = QFileDialog::getSaveFileName(this,QStringLiteral("保存文件"),"",QStringLiteral("支持的格式(*.png *.jpg *.bmp)"));if(filename.isNull()) return;if(!out.save(filename)) return;
}

mainwindow.h


#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>enum XSTATUS
{XPEN,XERASER
};QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:XSTATUS status = XPEN;MainWindow(QWidget *parent = nullptr);~MainWindow();
public slots:void setEraser();void setPen();void setColor();void save();
private:QColor col;Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

mainwindow.cpp


#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QColorDialog>
#include <QButtonGroup>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//打开图片connect(ui->openaction,SIGNAL(triggered()),ui->image,SLOT(Open()));connect(ui->saveaction,SIGNAL(triggered()),ui->image,SLOT(save()));col = QColor(200,0,0,200);setPen();//画笔和橡皮按钮排他选择QButtonGroup *gp = new QButtonGroup(this);gp->addButton(ui->eraseButton);gp->addButton(ui->penButton);gp->setExclusive(true);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::setPen()
{ui->image->setPen(ui->penSize->value(),col);status = XPEN;ui->penButton->setChecked(true);
}void MainWindow::setColor()
{col = QColorDialog::getColor(Qt::red,this);QString sty = QString("background-color:rgba(%1,%2,%3,%4)").arg(col.red()).arg(col.green()).arg(col.blue()).arg(col.alpha());ui->colorButton->setStyleSheet(sty);setPen();
}void MainWindow::setEraser()
{ui->image->setEraser(ui->penSize->value());status = XERASER;ui->eraseButton->setChecked(true);
}void MainWindow::save()
{ui->image->save();ui->statusbar->showMessage(QStringLiteral("保存结束"),5000);
}

main.cpp


#include "mainwindow.h"#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);MainWindow w;w.show();return a.exec();
}

ui_mainwindow.h


#ifndef UI_MAINWINDOW_H
#define UI_MAINWINDOW_H#include <QtCore/QVariant>
#include <QtGui/QAction>
#include <QtWidgets/QApplication>
#include <QtWidgets/QGroupBox>
#include <QtWidgets/QMainWindow>
#include <QtWidgets/QMenu>
#include <QtWidgets/QMenuBar>
#include <QtWidgets/QPushButton>
#include <QtWidgets/QScrollArea>
#include <QtWidgets/QSlider>
#include <QtWidgets/QStatusBar>
#include <QtWidgets/QWidget>
#include "ximage.h"QT_BEGIN_NAMESPACEclass Ui_MainWindow
{
public:QAction *openaction;QAction *saveaction;QWidget *centralwidget;QGroupBox *groupBox;QPushButton *penButton;QPushButton *eraseButton;QPushButton *colorButton;QSlider *penSize;QScrollArea *scrollArea;XImage *image;QMenuBar *menubar;QMenu *menu;QStatusBar *statusbar;void setupUi(QMainWindow *MainWindow){if (MainWindow->objectName().isEmpty())MainWindow->setObjectName(QString::fromUtf8("MainWindow"));MainWindow->resize(800, 600);openaction = new QAction(MainWindow);openaction->setObjectName(QString::fromUtf8("openaction"));saveaction = new QAction(MainWindow);saveaction->setObjectName(QString::fromUtf8("saveaction"));centralwidget = new QWidget(MainWindow);centralwidget->setObjectName(QString::fromUtf8("centralwidget"));groupBox = new QGroupBox(centralwidget);groupBox->setObjectName(QString::fromUtf8("groupBox"));groupBox->setGeometry(QRect(0, 0, 121, 561));penButton = new QPushButton(groupBox);penButton->setObjectName(QString::fromUtf8("penButton"));penButton->setGeometry(QRect(20, 40, 48, 48));penButton->setStyleSheet(QString::fromUtf8("background-image: url(./Resources/pen.png);"));penButton->setCheckable(true);penButton->setChecked(true);eraseButton = new QPushButton(groupBox);eraseButton->setObjectName(QString::fromUtf8("eraseButton"));eraseButton->setGeometry(QRect(20, 120, 48, 48));eraseButton->setStyleSheet(QString::fromUtf8("background-image: url(./Resources/eraser.png);"));eraseButton->setCheckable(true);colorButton = new QPushButton(groupBox);colorButton->setObjectName(QString::fromUtf8("colorButton"));colorButton->setGeometry(QRect(20, 200, 48, 48));colorButton->setStyleSheet(QString::fromUtf8("background-color: rgb(255, 0, 0);"));penSize = new QSlider(groupBox);penSize->setObjectName(QString::fromUtf8("penSize"));penSize->setGeometry(QRect(0, 280, 101, 16));penSize->setOrientation(Qt::Horizontal);scrollArea = new QScrollArea(centralwidget);scrollArea->setObjectName(QString::fromUtf8("scrollArea"));scrollArea->setGeometry(QRect(120, 0, 681, 581));scrollArea->setWidgetResizable(false);image = new XImage();image->setObjectName(QString::fromUtf8("image"));image->setGeometry(QRect(0, 0, 679, 579));scrollArea->setWidget(image);MainWindow->setCentralWidget(centralwidget);menubar = new QMenuBar(MainWindow);menubar->setObjectName(QString::fromUtf8("menubar"));menubar->setGeometry(QRect(0, 0, 800, 27));menu = new QMenu(menubar);menu->setObjectName(QString::fromUtf8("menu"));MainWindow->setMenuBar(menubar);statusbar = new QStatusBar(MainWindow);statusbar->setObjectName(QString::fromUtf8("statusbar"));MainWindow->setStatusBar(statusbar);menubar->addAction(menu->menuAction());menu->addAction(openaction);menu->addAction(saveaction);retranslateUi(MainWindow);QObject::connect(penSize, SIGNAL(valueChanged(int)), MainWindow, SLOT(setPen()));QObject::connect(colorButton, SIGNAL(clicked()), MainWindow, SLOT(setColor()));QObject::connect(penButton, SIGNAL(clicked()), MainWindow, SLOT(setPen()));QObject::connect(eraseButton, SIGNAL(clicked()), MainWindow, SLOT(setEraser()));QMetaObject::connectSlotsByName(MainWindow);} // setupUivoid retranslateUi(QMainWindow *MainWindow){MainWindow->setWindowTitle(QCoreApplication::translate("MainWindow", "MainWindow", nullptr));openaction->setText(QCoreApplication::translate("MainWindow", "\346\211\223\345\274\200", nullptr));
#if QT_CONFIG(shortcut)openaction->setShortcut(QCoreApplication::translate("MainWindow", "Ctrl+O", nullptr));
#endif // QT_CONFIG(shortcut)saveaction->setText(QCoreApplication::translate("MainWindow", "\344\277\235\345\255\230", nullptr));
#if QT_CONFIG(shortcut)saveaction->setShortcut(QCoreApplication::translate("MainWindow", "Ctrl+S", nullptr));
#endif // QT_CONFIG(shortcut)groupBox->setTitle(QCoreApplication::translate("MainWindow", "\345\267\245\345\205\267\346\240\217", nullptr));penButton->setText(QString());eraseButton->setText(QString());colorButton->setText(QCoreApplication::translate("MainWindow", "\351\242\234\350\211\262", nullptr));menu->setTitle(QCoreApplication::translate("MainWindow", "\346\226\207\344\273\266", nullptr));} // retranslateUi};namespace Ui {class MainWindow: public Ui_MainWindow {};
} // namespace UiQT_END_NAMESPACE#endif // UI_MAINWINDOW_H

这篇关于QPainter融合两张图片渲染的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/900411

相关文章

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

韦季李输入法_输入法和鼠标的深度融合

在数字化输入的新纪元,传统键盘输入方式正悄然进化。以往,面对实体键盘,我们常需目光游离于屏幕与键盘之间,以确认指尖下的精准位置。而屏幕键盘虽直观可见,却常因占据屏幕空间,迫使我们在操作与视野间做出妥协,频繁调整布局以兼顾输入与界面浏览。 幸而,韦季李输入法的横空出世,彻底颠覆了这一现状。它不仅对输入界面进行了革命性的重构,更巧妙地将鼠标这一传统外设融入其中,开创了一种前所未有的交互体验。 想象

Android 10.0 mtk平板camera2横屏预览旋转90度横屏拍照图片旋转90度功能实现

1.前言 在10.0的系统rom定制化开发中,在进行一些平板等默认横屏的设备开发的过程中,需要在进入camera2的 时候,默认预览图像也是需要横屏显示的,在上一篇已经实现了横屏预览功能,然后发现横屏预览后,拍照保存的图片 依然是竖屏的,所以说同样需要将图片也保存为横屏图标了,所以就需要看下mtk的camera2的相关横屏保存图片功能, 如何实现实现横屏保存图片功能 如图所示: 2.mtk

Spring MVC 图片上传

引入需要的包 <dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.1</version></dependency><dependency><groupId>commons-io</groupId><artifactId>commons-

Prompt - 将图片的表格转换成Markdown

Prompt - 将图片的表格转换成Markdown 0. 引言1. 提示词2. 原始版本 0. 引言 最近尝试将图片中的表格转换成Markdown格式,需要不断条件和优化提示词。记录一下调整好的提示词,以后在继续优化迭代。 1. 提示词 英文版本: You are an AI assistant tasked with extracting the content of

研究人员在RSA大会上演示利用恶意JPEG图片入侵企业内网

安全研究人员Marcus Murray在正在旧金山举行的RSA大会上公布了一种利用恶意JPEG图片入侵企业网络内部Windows服务器的新方法。  攻击流程及漏洞分析 最近,安全专家兼渗透测试员Marcus Murray发现了一种利用恶意JPEG图片来攻击Windows服务器的新方法,利用该方法还可以在目标网络中进行特权提升。几天前,在旧金山举行的RSA大会上,该Marcus现场展示了攻击流程,

恶意PNG:隐藏在图片中的“恶魔”

&lt;img src=&quot;https://i-blog.csdnimg.cn/blog_migrate/bffb187dc3546c6c5c6b8aa18b34b962.jpeg&quot; title=&quot;214201hhuuhubsuyuukbfy_meitu_1_meitu_2.jpg&quot;/&gt;&lt;/strong&gt;&lt;/span&gt;&lt;

PHP抓取网站图片脚本

方法一: <?phpheader("Content-type:image/jpeg"); class download_image{function read_url($str) { $file=fopen($str,"r");$result = ''; while(!feof($file)) { $result.=fgets($file,9999); } fclose($file); re

(入门篇)JavaScript 网页设计案例浅析-简单的交互式图片轮播

网页设计已经成为了每个前端开发者的必备技能,而 JavaScript 作为前端三大基础之一,更是为网页赋予了互动性和动态效果。本篇文章将通过一个简单的 JavaScript 案例,带你了解网页设计中的一些常见技巧和技术原理。今天就说一说一个常见的图片轮播效果。相信大家在各类电商网站、个人博客或者展示页面中,都看到过这种轮播图。它的核心功能是展示多张图片,并且用户可以通过点击按钮,左右切换图片。