Qt QML实现鼠标自由选择不规则区域进行截图
背景
不规则区域进行截图是一种常见的应用场景,通常用于程序截图工具或者图像处理软件中。主要是为了让用户可以自由选择任意形状的区域进行截图,而不仅仅局限于矩形区域。这样用户可以更灵活地进行截图操作,特别是对于需要截取特定形状区域的情况下非常实用。
通过实现鼠标自由选择不规则区域进行截图,用户可以更精确地选择需要截取的内容,避免不必要的部分被包含在截图中。
效果
先来看下运行效果:
截图效果:
可以看到,截图内容是根据鼠标自由选区来截取不规则的图形,其他区域为透明的。
关键代码
实现逻辑是在QML中鼠标选区记录坐标点,然后截取整个屏幕画面,根据坐标点将图片内容拷贝出来生成新的图片。
保存部分的代码:
void ScreenshotController::saveScreenshot(const QVariantList &points, const QString &format)
{
if (!m_isCapturing || points.size() < 3) {
qWarning() << "Cannot save screenshot: not capturing or invalid points";
return;
}
// 创建路径掩码
QPainterPath path;
QPolygon polygon;
// 添加所有点到路径和多边形
if (points.size() > 0) {
QPointF firstPoint = points[0].toPointF();
path.moveTo(firstPoint);
polygon << QPoint(firstPoint.x(), firstPoint.y());
for (int i = 1; i < points.size(); i++) {
QPointF p = points[i].toPointF();
path.lineTo(p);
polygon << QPoint(p.x(), p.y());
qDebug() <<__FUNCTION__<< "point=" << p;
}
// 闭合路径
path.closeSubpath();
}
// 获取选区的边界矩形
QRect boundingRect = polygon.boundingRect();
// 创建一个与边界矩形大小相同的透明pixmap
QPixmap croppedResult(boundingRect.size());
croppedResult.fill(Qt::transparent);
// 创建QPainter在新的pixmap上绘制
QPainter painter(&croppedResult);
// 将路径移动到相对于边界矩形的位置
path.translate(-boundingRect.topLeft());
// 设置剪切路径,只绘制路径内的内容
painter.setClipPath(path);
// 绘制原始截图的对应部分
painter.drawPixmap(0, 0, m_originalPixmap, boundingRect.x(), boundingRect.y(), boundingRect.width(), boundingRect.height());
// 结束绘制
painter.end();
// 生成默认文件名
QString defaultFileName = QStandardPaths::writableLocation(QStandardPaths::PicturesLocation) +
"/screenshot_" +
QDateTime::currentDateTime().toString("yyyyMMdd_hhmmss") +
"." + format.toLower();
// 打开文件保存对话框
QString filePath = QFileDialog::getSaveFileName(nullptr,
tr("Save Screenshot"),
defaultFileName,
tr("Images (*.%1)").arg(format.toLower()));
if (!filePath.isEmpty()) {
// 保存截图
if (croppedResult.save(filePath, format.toUtf8().constData())) {
qDebug() << "Screenshot saved to:" << filePath;
emit captureSaved(filePath);
} else {
qWarning() << "Failed to save screenshot to:" << filePath;
}
}
// 重置状态
m_isCapturing = false;
emit isCapturingChanged();
}
源代码下载
原文地址:https://blog.csdn.net/luoyayun361/article/details/146257529
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.kler.cn/a/585367.html 如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.kler.cn/a/585367.html 如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!