依托svg文件生成任意颜色的png文件

void SetSVGBackColor(QDomElement& elem, QString strtagname, QString strattr, QString strattrval)
{
    if (elem.tagName().compare(strtagname) == 0)
    {
        QString before_color = elem.attribute(strattr);
        elem.setAttribute(strattr, strattrval);
        QString color = elem.attribute(strattr);
    }
    for (int i = 0; i < elem.childNodes().count(); i++)
    {
        if (!elem.childNodes().at(i).isElement())
        {
            continue;
        }
        SetSVGBackColor(elem.childNodes().at(i).toElement(), strtagname, strattr, strattrval);
    }
}
void init_svg(QString img_path, QImage* image, QString color)
{
    QFile file(img_path);
    if (file.open(QIODevice::ReadOnly))
    {
        QByteArray svg_buffer = file.readAll();
        file.close();
        QDomDocument doc;
        doc.setContent(svg_buffer);
        SetSVGBackColor(doc.documentElement(), "path", "fill", color);
        QSvgRenderer* render_image = new QSvgRenderer(doc.toByteArray());
        QPainter painter_image(image);
        painter_image.setCompositionMode(QPainter::CompositionMode_Clear); // 清除画布
        painter_image.fillRect(image->rect(), Qt::transparent); // 填充透明色
        painter_image.setCompositionMode(QPainter::CompositionMode_SourceOver);     // 恢复默认值
        render_image->render(&painter_image);
        delete render_image;
    }
}

参数: 

指定svg图片的文件(svg_path)

指定希望生成的png的颜色(color)

指定希望得到的png文件的位置(file_path)

void distribution_system::init_a_png(QString svg_name,QString png_name,QString color)
{
	QString path = QApplication::applicationDirPath() + "/images/navbar/";
	QString svg_path = path + svg_name + ".svg";
	QString file_path = path + png_name + ".png";
	QImage* image = new QImage(200, 200, QImage::Format_ARGB32);
	init_svg(svg_path, image, color);
	image->save(file_path, "png", -1);
	delete image;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lpl还在学习的路上

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值