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

news/2025/1/19 19:11:42/文章来源:https://www.cnblogs.com/rongjv/p/18679422

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/871802.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

春秋杯冬季赛-EzMisc WP

后面两天本来没打算写出来啥题的,因为都太难了呜呜,但是这道题竟然做出来了(虽然花了接近3个小时),还是有点小激动 前排提醒 1、是看了提示之后才做出来的题目提示:1、利⽤DP泄露来求出私钥,从⽽还原私钥流解密密⽂ 2、图片经过了Arnold变换2、存在偶然性,复现难度挺大…

信息量,熵,交叉熵,相对熵的定义

本文将介绍信息量,熵,交叉熵,相对熵的定义,以及它们与机器学习算法中代价函数的定义的联系。转载请保留原文链接:http://www.cnblogs.com/llhthinker/p/7287029.html 1. 信息量 信息的量化计算:解释如下:信息量的大小应该可以衡量事件发生的“惊讶程度”或不确定性: 如…

探索照片新艺术:在线将你的照片转为油画杰作

在数字时代,我们每天都在捕捉生活的瞬间,但你是否想过将这些平凡的照片转变为独一无二的艺术品?今天,我要向大家推荐一个令人兴奋的在线平台——img4you,它利用尖端的AI技术,让你的照片瞬间“穿上”油画的华服。 轻松体验在线照片转油画: https://www.img4you.com/style…

通俗理解深度学习中的熵相关知识【信息量、熵、相对熵(KL散度)、交叉熵】

https://zhuanlan.zhihu.com/p/647312079 通俗理解:一个事件从不确定变为确定的难度有多大 往往某件事情发生概率越低,信息量越大,从不确定变为确定的难度越大 ex:【中国队想要在世界杯夺冠】这一事件发生概率极极极低,信息量非常大,想要实现即“从不确定变为确定”的难度…

IPv6路由

前言 在企业网络中,IPv6技术的应用越来越普及。IETF组织针对IPv6网络制定了两种路由协议RIPng和OSPFV3。 路由过程IPv6中的动态路由的下一跳为链路本地地址,静态路由为手动指定的单播地址 链路本地地址只在接口所连接的链路上有效,ping链路本地地址需要指定接口路由配置静态路…

【bp爆破流程】不知道存活用户的喷洒

经典情况: 无论是用户名不存在,还是用户名存在但密码错误,统一返回“用户名或密码错误”这种情况又要怎么办呢❓ 如果没有其他接口配合,我们是很难确定存活用户了,我们也不可能用5w的用户名和6w的密码字典去交叉爆破,量级达到30亿了都。这种情况下,我们首先可以挑一些常…

【SpringBoot应用】统计、监控 SQL 运行情况

基本概念 Druid,作为Java领域一款杰出的数据库连接池,不仅因其源自阿里巴巴的深厚背景而备受信赖,更以其卓越的功能性、性能表现以及高度可扩展性在众多数据库连接池中脱颖而出。 尽管HikariCP在速度上略有优势,但Druid凭借其强大的监控和扩展能力,成为了许多项目首选的数…

从0到1:AI微信红包开发全攻略,小白也能轻松上手!

AI编程时代真的来了!最近我重度沉迷AI编程,发现它简直是开发神器,前端页面、后端服务,都能轻松搞定,效率直接起飞!最近临近过年,我突然冒出一个想法:为什么不试试用AI来做个微信红包呢? 说干就干! 1. 明确需求 要用AI做红包,首先得了解微信红包的规则。简单来说,我…

【安全运营】安全风险管理

一、什么是安全风险二、如何评估安全风险2.1 确定影响范围2.2 确定威胁2.3 确定脆弱性2.4 计算风险值2.5 评估结论三、为什么要管理安全风险四、如何管理安全风险4.1 背景建立4.2 风险评估4.3 风险处理4.4 批准监督原创 xiejava fullbug在信息时代,信息已经成为第一战略资源,…

collectd:系统统计信息收集守护进程软件

一、概述二、主要功能三、应用场景四、与其他监控工具的比较五、安装与配置六、总结Collectd是一个系统统计信息收集守护进程(daemon),主要用于收集系统性能和提供各种存储方式来存储不同值的机制。 一、概述 •定义:Collectd是一个基于C语言研发的插件式架构的监控软件,通…

【Java】Java UML 类图绘制解析:结构与工具类型详解

前言常用UML绘图工具1、Visual Paradigm2. Lucidchart3. Draw.io (现名diagrams.net)4. PlantUML(推荐)5. StarUML类与类之间的关系UML中的关系是面向对象关系。PlantUML类之间的关系符号定义UML 类图实战1、类 (Class)2、接口 (Interface)3、实现 (Implementation)4、继承 (…

红黑树插入与删除操作的基本规则

刷题又久违刷到了红黑树的知识,才发现上次学完之后没有及时留下笔记,现在又回到了一知半解的状态。写技术笔记是多么重要啊(喝老鼠药.jpg),以下为这次学到知识的简单总结。 通俗来说 红黑树更像是一种有规则的“交通系统”,每个交叉口是一个节点,红色代表“警示”或“等…