核心代码如下:
// 使用Qpainter显示图片
void PlayImageWidget::paintEvent(QPaintEvent *event)
{
if(!m_pixmap.isNull())
{
QPainter painter(this);
QPixmap pixmap = m_pixmap.scaled(this->size(), Qt::KeepAspectRatio); // 调整图片大小保持图片比例不变
// 计算中心点位置,图片居中
int x = (this->width() - pixmap.width()) / 2;
qDebug() << "x: " << x << "this->width(): " << this->width() << "pixmap.width(): " << pixmap.width();
int y = (this->height() - pixmap.height()) / 2;
qDebug() << "y: " << x << "this->height(): " << this->height() << "pixmap.height(): " << pixmap.height();
painter.drawPixmap(x, y, pixmap);
}
QWidget::paintEvent(event);
}
支持传入QImage和QPixmap,增加:加载图片、修改保存、删除文件、图片添加文字、翻转图片几个功能,适合需要查找API的小伙伴。
加载图片
QString filter = "Image Files (*.png *.jpg *.jpeg)";
QString str = QFileDialog::getOpenFileName(this, "打开图片", "/", filter);
// 如果用户取消了对话框,则 str 将为空字符串
if (str.isEmpty())
{
return;
}
// 创建一个 QImageReader 来加载所选图像文件
QImageReader reader(str);
// 检查文件是否可以被加载
if (!reader.canRead())
{
QMessageBox::warning(this, "打开图片", "加载图片失败.");
return;
}
else
{
filePath = str;
}
// 从 reader 获取图像数据
QImage image = reader.read();
// 使用图像更新界面或执行其他操作
m_pWidget->updateImage(image);
保存图片
// 检查filePath是否有效
if (filePath.isEmpty()) {
QMessageBox::warning(this, "保存图片", "未选择图片.");
return;
}
// 获取修改后的QImage对象
QImage modifiedImage = m_pWidget->getPixmap().toImage(); // 返回当前显示的图像
// 保存图片的过滤器,例如只允许保存为PNG和JPEG格式
QString filter = "Images (*.png *.jpg)";
// 获取保存图片的文件名
QString fileName = QFileDialog::getSaveFileName(this, tr("Save Image"), filePath, filter);
// 如果用户没有选择任何文件,即点击了取消
if (fileName.isEmpty()) {
return;
}
// 尝试保存图片
bool success = modifiedImage.save(fileName);
if (!success) {
// 如果保存失败,给出警告
QMessageBox::critical(this, "保存图片", "保存图片失败.");
} else {
// 如果成功,更新filePath以便于下次保存
filePath = fileName;
QMessageBox::information(this, "保存图片", "图片已保存.");
}
删除文件
//删除文件
if (QFile::remove(filePath))
{
QMessageBox::information(this, "删除文件", "删除文件成功.");
}
图片添加文字
文字和添加位置等可以自己拓展
// 获取 QPixmap 对象
QPixmap pixmap = m_pWidget->getPixmap();
// 实例 QPainter 并开始在 pixmap 上绘画
QPainter painter(&pixmap);
// 设置画刷模式
painter.setCompositionMode(QPainter::CompositionMode_SourceIn);
// 改变画笔和字体
QPen pen(Qt::red);
painter.setPen(pen);
QFont font;
font.setBold(true); // 加粗
font.setPixelSize(100); // 改变字体大小
painter.setFont(font);
// 将文字绘制在图片中心位置
painter.drawText(pixmap.rect(), Qt::AlignCenter, "Hello,World");
// 更新 widget 的 pixmap 显示
m_pWidget->updatePixmap(pixmap);
翻转图片
// 获取 QPixmap 对象
QPixmap pixmap = m_pWidget->getPixmap();
// 水平翻转 pixmap
pixmap = QPixmap::fromImage(pixmap.toImage().mirrored(true, false)); // 两个参数分别对应水平和垂直翻转
// 更新 widget 的 pixmap 显示
m_pWidget->updatePixmap(pixmap);