首页 > 其他分享 >[rustGUI][iced]基于rust的GUI库iced(0.13)的部件学习(05):svg图片转为png格式(暨svg部件的使用)

[rustGUI][iced]基于rust的GUI库iced(0.13)的部件学习(05):svg图片转为png格式(暨svg部件的使用)

时间:2025-01-19 19:34:59浏览次数:1  
标签:iced svg self 部件 let resvg png

前言
本文是关于iced库的部件介绍,iced库是基于rust的GUI库,作者自述是受Elm启发。
iced目前的版本是0.13.1,相较于此前的0.12版本,有较大改动。
本合集是基于新版本的关于分部件(widget)的使用介绍,包括源代码介绍、实例使用等。

环境配置
系统:window10
平台:visual studio code
语言:rust
库:iced 0.13
扩展库:iced_aw

svg转png

在之前的第一篇博文中,就说过图片格式的转换,主要是将png转为icon,以便于获取图片作为iced窗口的图标。
我们使用了一个图片处理库image,我们需要添加依赖:

cargo add image

然后导入时为了不与iced本身的image产生冲突,因此可以重新命名:

extern crate image as eximg

不过,外部image库并不支持直接转换svg格式,所以我们将使用另一个库,用于处理svg图片:

cargo add resvg

image

1、iced中显示svg

在iced中,如果要显示svg图片,如同添加image部件一样,需要先开启features:

iced={version ="0.13.1",features = ["svg","image"]}

然后在主程序中导入svg:

use iced::widget::{button, column, row, svg, text,container};

显示svg图片与显示png图片一样,我们在view函数中编写:

let svghandle=svg::Handle::from_path(self.srcpath.as_str());
let svgcolor=Color::parse("#56F25EFF").unwrap();
let svg1=svg(svghandle).content_fit(iced::ContentFit::Contain)
         .style(move |t,s|styles::mysvgstyle(t,s,svgcolor));

可以看到,svg的参数也是Handle,与image是一样的,但是二者的struct构成有所区别。

官方源码
/// A handle of Svg data.
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Handle {
    id: u64,
    data: Arc<Data>,
}

我们去网站上下载一张svg格式的图片,比如:
image
我们在iced窗口中显示,由于svg图片是矢量图形,我们可以设置一个背景色,以便于观察:
image
hover状态:
image

2、svg转png

说一下本文的思路,使用resvg库将svg图片转为字节数组,字节数组作为通用格式,使用image库将其转为png格式。
基本上,这是一个很简单好用的思路,无论什么格式的图片,都能够转为比较底层的数据,即字节数组,这也是非常通用的数据格式,只要能处理字节数组,就能够还原其图像数据。
所以,我们的转换的中转站,就是Vec<u8>
我们在此前的博文里,创建过一个imgconvert.rs,添加了imgtoico函数,现在,我们可以在此文件中再创建一个函数:

///
/// svg转png
/// 
pub fn svgtoimg(
    svgpath: &str,
    destimgpath: &str,
) ->Result<(), eximg::ImageError>{
    let mut opt=resvg::usvg::Options::default();
    opt.resources_dir=std::fs::canonicalize(svgpath)
                                 .ok()
                                 .and_then(|p| p.parent().map(|p| p.to_path_buf()));
    opt.fontdb_mut().load_system_fonts();

    let svgdata=std::fs::read(svgpath).unwrap();
    let tree=resvg::usvg::Tree::from_data(&svgdata,&opt).unwrap();
    let pixmap_size = tree.size().to_int_size();
    let mut pixmap = resvg::tiny_skia::Pixmap::new(pixmap_size.width(), pixmap_size.height()).unwrap();
    resvg::render(&tree, resvg::tiny_skia::Transform::default(), &mut pixmap.as_mut());
    //pixmap.save_png(destimgpath).unwrap();
    let pp=pixmap.encode_png().unwrap();
    let img=eximg::ImageReader::new(std::io::Cursor::new(pp))
                                        .with_guessed_format()?.decode()?;
    img.save(destimgpath).unwrap();
    Ok(())

}

我们只需要为函数输入源图片即svg图片的路径与目标图片即png图片的路径即可。
此处转换的核心是resvg库,上述函数的部分代码就是resvg的示例代码,直接复制使用即可。基本上用到了resvg的usvg和tiny_skia这两个子库。此处如果想要深入研究,可以去查看resvg的源码,本文不作赘述。(目前我也说不清楚,会用即可)

3、综述

本文,我们实现的是,通过一个导入按钮导入svg图片,然后通过另一个转换按钮转换格式至png,并保存图片。
由于我们会使用到文件对话框以及获取本地日期,所以我们还需要添加两个库:

rfd="0.15.2"
chrono = "0.4.39"

我们在update函数中编写按钮的逻辑:

     Message::Load =>{
                let res=FileDialog::new()
                                    .set_title("载入svg")
                                    .add_filter("Svg Files",&["svg"])
                                    .set_directory("/")
                                    .pick_file();
                match res {
                    Some(path) =>{

                        self.srcpath = path.display().to_string();
                        self.tipcontent="".to_string();

                    },
                    None =>{

                        self.srcpath =String::new();
                        
                    }
                }
            }
	Message::Convert =>{

                if self.srcpath.is_empty() {
                    self.tipcontent="请先导入svg文件!".to_string();
                }
                else{
                    self.tipcontent="".to_string();
                    let now=Local::now();
                    let date_str=now.format("%Y-%m-%d-%H-%M-%S").to_string();
                    //println!("转换时间:{}",date_str);
                    //获取源图片的父路径
                    let mut path = std::path::PathBuf::from(&self.srcpath).parent().unwrap().to_path_buf();
                    let imgname="output-".to_string() + date_str.as_str();
                    path.push(imgname);
                    path.set_extension("png");
                    self.dstpath =path.to_str().unwrap().to_string();
                    //svg转png函数
                    let res=imgconvert::svgtoimg(&self.srcpath, &self.dstpath);
                    match res {
                        Ok(_) =>{

                        },
                        Err(e) =>{
                            MessageDialog::new()

                                .set_title("提示!")
                                .set_description(&e.to_string())
                                .show();
                        }
                    }
                }
            }

当我们转换后,会在本地文件夹生成带有日期的png图片。
动态演示:
image

标签:iced,svg,self,部件,let,resvg,png
From: https://www.cnblogs.com/rongjv/p/18679422

相关文章

  • SVG To Font 创建自己的字体图标库
    关于字体图标字体图标是一种特殊的字体,它可以像文字一样,通过CSS来控制它的大小和颜色。SVGToFontSVG虽然也能在网站中直接使用,但是它如果要修改大小或者颜色的话,就需要更改SVG的源码,特别不方便!网上有许多SVG转Font的方式,这里介绍一种js库svgtofont,用脚本......
  • Unity Shader Graph 2D - 角色身上部件高亮Bloom效果
    在游戏中,角色身上部件的高亮Bloom效果是游戏中比较基础且常见的效果。本文将带大家实现游戏中角色身上部件的高亮Bloom效果,同时也会用到Unity中PostProcessing(后期处理)相关的基础功能。BloomBloom是一种图像后期处理的效果,可让高光部分更加的强烈,产生散射开的效果,从而使游......
  • [rustGUI][iced]基于rust的GUI库iced(0.13)的部件学习(04):实现窗口主题(颜色)变换(暨menu菜单
    前言本文是关于iced库的部件介绍,iced库是基于rust的GUI库,作者自述是受Elm启发。iced目前的版本是0.13.1,相较于此前的0.12版本,有较大改动。本合集是基于新版本的关于分部件(widget)的使用介绍,包括源代码介绍、实例使用等。环境配置系统:window10平台:visualstudiocode语言:rust......
  • 商用车电子电气零部件电磁兼容条件和试验(3)—部件分类及代号
    写在前面本系列文章主要讲解商用车电子/电气零部件或系统的传导抗干扰、传导发射和辐射抗干扰、电场辐射发射以及静电放电等试验内容及要求,高压试验项目内容及要求。若有相关问题,欢迎评论沟通,共同进步。(*^▽^*)目录商用车电子电气零部件电磁兼容条件和试验(0)—目录-CSDN博......
  • 一对一直播平台源码,SVG在前端的使用方法
    一对一直播平台源码,SVG在前端的使用方法1.在浏览器直接打开<?xmlversion="1.0"?><svgwidth="100%"height="100%"version="1.1"xmlns="http://www.w3.org/2000/svg"><title>雷猴</title><circlecx=......
  • [rustGUI][iced]基于rust的GUI库iced(0.13)的部件学习(03):图像的导入、显示、调整(暨image
    前言本文是关于iced库的部件介绍,iced库是基于rust的GUI库,作者自述是受Elm启发。iced目前的版本是0.13.1,相较于此前的0.12版本,有较大改动。本合集是基于新版本的关于分部件(widget)的使用介绍,包括源代码介绍、实例使用等。环境配置系统:window10平台:visualstudiocode语言:rust......
  • [rustGUI][iced]基于rust的GUI库iced(0.13)的部件学习(02):滑动条部件实现部件(文本或其他)缩
    前言本文是关于iced库的部件介绍,iced库是基于rust的GUI库,作者自述是受Elm启发。iced目前的版本是0.13.1,相较于此前的0.12版本,有较大改动。本合集是基于新版本的关于分部件(widget)的使用介绍,包括源代码介绍、实例使用等。环境配置系统:window10平台:visualstudiocode语言:rust......
  • 【 lvgl专题】LVGL核心部件——弧(arc)控件的介绍
    概述本文介绍LVGL核心部件——弧(arc),它由背景和前景弧组成。前景(指示器)可以进行触摸调整。 LVGL核心部件——弧(arc)控件一、部件和样式 LV_PART_MAIN 使用典型的背景样式属性绘制背景,使用圆弧样式属性绘制圆弧。圆弧的大小和位置将遵循 padding 样式属性。LV_PART_I......
  • [rustGUI][iced]基于rust的GUI库iced(0.13)的部件学习(00):iced简单窗口的实现以及在窗口显
    前言本文是关于iced库的部件介绍,iced库是基于rust的GUI库,作者自述是受Elm启发。iced目前的版本是0.13.1,相较于此前的0.12版本,有较大改动。本合集是基于新版本的关于分部件(widget)的使用介绍,包括源代码介绍、实例使用等。环境配置系统:window10平台:visualstudiocode语言:rust......
  • Flurl.Http集成Microsoft.Extensions.ServiceDiscovery
    .Net8.0及以上版本,微软官方提供了服务发现Nuget包Microsoft.Extensions.ServiceDiscovery,能够对HttpClient请求服务进行服务发现和解析,对于轻量级Flurl.Http来说,也可以进行集成,主要思路是通过HttpClientFactory构建HttpClient实例,调用newFlurlClient(httpClientFactory.Crea......