前言

本文是关于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

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格式的图片,比如:



我们在iced窗口中显示,由于svg图片是矢量图形,我们可以设置一个背景色,以便于观察:



hover状态:

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图片。

动态演示:

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

  1. [OpenCV实战]28 基于OpenCV的GUI库cvui

    目录 1 cvui的使用 1.1 如何在您的应用程序中添加cvui 1.2 基本的"hello world"应用程序 2 更高级的应用 3 代码 4 参考 有很多很棒的GUI库,例 ...

  2. 新做的一个基于OPENGL的gui库

    #include <BGE/All> ,text);     button->setName(name);     button->setSize(Vector2f(,)); ...

  3. Python GUI库

    PyQT不错的,只是要小心,这个东西是GPL的,如果你要写商业程序需要购买商业版授权.另外PyGTK.wxPython都是不错的GUI库.Python自带了一个基于TkInter的GUI库,如果你不想 ...

  4. 8个免费实用的C++GUI库(转载)

      C++标准中并没有包含GUI,这也使得C++开发图形化界面需要依赖于第三方的库.实际上,图形界面恰恰是C++的强项,小到平常使用的各类桌面软件,大到魔兽世界这样的游戏,都是C++擅长的地方.C++ ...

  5. Python 图形 GUI 库 pyqtgraph

    原文  Python 图形 GUI 库 pyqtgraph pyqtgraph 是纯 Python 图形 GUI 库,基于PyQT4 /pyside和NumPy.它主要目的用于在数学/科学/工程中.M ...

  6. 8个免费实用的C++GUI库

    8个免费实用的C++GUI库 C++标准中并没有包含GUI,这也使得C++开发图形化界面需要依赖于第三方的库.实际上,图形界面恰恰是C++的强项,小到平常使用的各类桌面软件,大到魔兽世界这样的游戏,都 ...

  7. C/C++编程GUI库比较

    转自:http://blog.csdn.net/lostown/article/details/658654 最强的GUI库当属Qt,毕竟是商业化的东西,功能最完整,什么都好,包括类似java代码风格 ...

  8. 用PYTHON首选的GUI库WXPYTHON做程序界面

    大家好,我是A8U神经网络,今天又要跟大家分享一下wxWidgets开发神经网络程序界面的一些经验,希望对开发有兴趣的朋友有所帮助.跨平台的GUI工具库以GTK +,Qt和wxWidgets闻名. G ...

  9. Qt和其它GUI库的对比

    http://c.biancheng.net/view/3876.html 世界上的 GUI 库多如牛毛,有的跨平台,有的专属于某个操作系统:有的只有 UI 功能,有的还融合了网络通信.多媒体处理.数 ...

  10. 8个必备的Python GUI库

    Python GUI 库有很多,下面给大家罗列常用的几种 GUI 库.下面介绍的这些GUI框架,能满足大部分开发人员的需要,你可以根据自己的需求,选择合适的GUI库. 很多人学习python,不知道从 ...

随机推荐

  1. 干货分享:Air780E软件指南:字符串处理

    一.Lua字符串介绍 关于字符串,Lua提供了一些灵活且强大的功能,一些入门知识如下: 1.1 字符串定义 在Lua中,字符串可以用单引号'或双引号"来定义.例如: localstr1='H ...

  2. jenkins拉取github代码报错问题解决

    问题起因: 踩坑踩坑 用jenkins拉取github项目的代码时,配置完成点击构建时,报错信息为:Couldn't find any revision to build. Verify the re ...

  3. P4629 SHOI2015 聚变反应炉

    P4629 SHOI2015 聚变反应炉 树上背包+树形dp. 算是套娃题吗? 思路 看到数据考虑数据分治. part1 贪心 \(c_i\leq 1\) 对于这种情况,我们考虑贪心的点亮. 手玩几组 ...

  4. (Python基础教程之六)Python中的关键字

    Python基础教程 在SublimeEditor中配置Python环境 Python代码中添加注释 Python中的变量的使用 Python中的数据类型 Python中的关键字 Python字符串操 ...

  5. ANTLR语法层的选项及动作 - ANTLR

    ANTLR语法层的选项 ANTLR语法层的选项中可以设置一系列的键值从而影响ANTLR输出的代码.这些选项是全局的,除非在某条规 则中覆盖了这些选项,否则这些选项会影响到该语法中的所有元素.选项应该紧 ...

  6. 五、FreeRTOS学习笔记-任务创建和删除(动态方式)

    1任务控制块:保存任务的一些信息 (STM32的栈是由告高地址向低地址延伸的,由上向下生长) (STM32的堆是由告低地址向高地址延伸的,由下向上生长) 第一步申请内存 如下如所示步骤找到xTaskC ...

  7. 抓包工具之Fiddler(详解)

    Fiddle简介 Fiddler是最强大最好用的Web调试工具之一,它能记录所有客户端和服务器的http和https请求,允许你监视,设置断点,甚至修改输入输出数据,Fiddler包含了一个强大的基于 ...

  8. .net core想到哪写道哪之hello world

    今天,我们来创建一个helo world,讲一讲.Net 6最新的顶级语句的问题. 在.Net 6中最大的变化应该就是多了个顶级语句. 这玩意是个啥呢,它让C#看起来像个脚本语言了,一个Hello W ...

  9. Blazor 组件库 BootstrapBlazor 中AutoComplete组件介绍

    AutoComplete组件介绍 AutoComplete组件和文本框基本上样子是一样的,只不过AutoComplete组件还带有一个下拉列表,可以从中选择对应的内容. 其同样继承自Bootstrap ...

  10. 多线程编程入门Thread_Task_async_await简单秒懂

    ` using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; u ...