svg图片通过QImage的save保存不成功问题解决

在Qt中,QImage对象无法直接使用save方法保存SVG格式的图片。要正确保存SVG,需要使用QSvgGenerator结合QPainter进行绘制并保存。具体步骤包括创建QSvgGenerator,设置文件名、大小和视口,然后在QPainter上下文中绘制QImage并结束绘画过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题的提出:

有个svg格式的图片,通过
QImage类的save方法保存始终返回false,如下:

bool bRet = image.save("1.svg");

其中image是QImage类型的对象,加载了一个名为为1.svg的图片,当调用save时,返回值始终是false。感觉svg类型的图片不能用QImage类的save保存,通过下述代码保存可以成功:

    QSvgGenerator generator;
	generator.setFileName(qsSaveFilePath); // qsSaveFilePath是svg图片的路径
	generator.setSize(image.size()); // image是加载了svg图片的QImage对象
	generator.setViewBox(QRect(0, 0, image.width(), image.height())); 
	generator.setTitle(tr("save mirrored image to local "));
	generator.setDescription(tr("save mirrored image to local "));
	
	QPainter painter;
	painter.begin(&generator);
	painter.drawImage(QPoint(0, 0), image);
	painter.end();

Qt中,你可以使用`QGraphicsView`和`QGraphicsScene`来处理SVG图像,并通过`QPainter`或`QImage`类进行旋转操作。以下是一个简单的步骤指南: 1. **加载SVG文件**: 使用`QSvgWidget`来加载SVG图像,因为它已经内建了对SVG的支持。 ```cpp QGraphicsScene scene; QSvgWidget svgWidget("image.svg"); scene.addPixmap(svgWidget.pixmap()); ``` 2. **创建`QGraphicsItem`**: 获取`QGraphicsScene`中的`QGraphicsPixmapItem`,它包含了SVG图像。 ```cpp QGraphicsPixmapItem pixmapItem = scene.items().first(); ``` 3. **旋转图像**: 使用`rotate()`函数旋转`QGraphicsPixmapItem`。例如,如果你想逆时针旋转45度,可以这样做: ```cpp QPointF rotationCenter(pixmapItem.boundingRect().center()); qreal angle = -45; // 逆时针旋转角度 pixmapItem.setTransform(QTransform::fromRotate(angle, rotationCenter)); ``` 4. **获取旋转后的图像数据**: 如果你需要将旋转后的图像保存为新的SVG文件,可以先转换为`QImage`,然后使用`QPainter`绘制到新图上: ```cpp QImage rotatedImage = pixmapItem.pixmap().toImage().transformed(QTransform::fromRotate(angle, QPointF(0,0))); QPainter painter(&rotatedImage); pixmapItem.render(&painter); ``` 5. **保存旋转后的SVG**: 转换回SVG格式并保存: ```cpp QFile newSvgFile("rotated_image.svg"); if (newSvgFile.open(QIODevice::WriteOnly | QIODevice::Text)) { QTextStream svgStream(&newSvgFile); rotatedImage.save(svgStream, "SVG", QSize(), Qt::KeepAspectRatio); newSvgFile.close(); } ``` 请注意,这只是一个基础示例,实际应用中可能需要处理更多细节,如错误检查、缩放等问题。另外,如果你只是想在界面上显示旋转的SVG需要保存,可以直接使用`setPos()`和`setTransform()`调整位置和旋转。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值