- VisualStudio2022插件的安装及使用-编程手把手系列文章
- pprof-在现网场景怎么用
- C#实现的下拉多选框,下拉多选树,多级节点
- 【学习笔记】基础数据结构:猫树
前言 本文是关于iced库的部件介绍,iced库是基于rust的GUI库,作者自述是受Elm启发。 iced目前的版本是0.13.1,相较于此前的0.12版本,有较大改动。 本合集是基于新版本的关于分部件(widget)的使用介绍,包括源代码介绍、实例使用等.
环境配置 系统:window10 平台:visual studio code 语言:rust 库:iced 0.13 。
iced中显示图像,可以使用image部件,但image部件不是默认启用的,需要启用feature。在toml文件添加:
iced={version="0.13.1", features=["image"]}
然后在代码中导入:
use iced::widget::{button,column,text,row,container,slider,image};
之前我们在介绍为iced窗口设置图标时还提到过一个外部图像库image:
image="0.25.5"
导入image,为了不与iced的image部件名称冲突,需要为image改个名称:
extern crate image as eximg;
图像导入,通常需要使用文件对话框来导入文件,在iced中并没有提供对应的部件,因此,我们需要使用一个外部库,RFD,首先在toml中添加:
rfd="0.15.2"
下面是rfd库支持的功能: 包括了文件导入、保存、文件夹选择等,当然rfd也可以支持消息对话框.
use rfd::{FileDialog,MessageDialog};
本文的目的是实现图像文件的导入与显示,并可以调整一些图像属性,如大小、透明度等,因此,我们将添加一个按钮用于触发文件选中对话框,获取图像文件的路径并显示。 我们为结构体添加一个变量用于记录图像路径:
#[derive(Clone)]
struct Counter {
slidervalue:f32,
slidervalue2:f32,
imgpath:String,
}
上述imgpath即图像路径变量,另外两个变量用于接受slider部件的实时值,因为我们需要调整图像的大小和透明度,正好可以适应slider,而关于slider的使用介绍,我们在上一篇博文里有单独介绍: [rustGUI][iced]基于rust的GUI库iced(0.13)的部件学习(02):滑动条部件实现部件(文本或其他)缩放(slider) 然后我们添加按钮触发消息:
#[derive(Debug,Clone, Copy)]
enum Message {
SliderChange(f32),
SliderChange2(f32),
BtnLoad,
}
上述的BtnLoad是按钮触发消息,另外两个是slider的滑动时触发,就不多说了。 我们希望的是,点击按钮时弹出文件对话框,因此需要在view函数里添加:
let btn_load=button(text("加载图片").size(15)).width(80).height(40)
.on_press(Message::BtnLoad);
然后在update函数里更新状态:
Message::BtnLoad =>{
if let Some(file)=FileDialog::new()
.set_title("选择图片")
.add_filter("Image",&["png","jpg","jpeg","bmp"])
.add_filter("png",&["png"])
.set_directory("C://")
.pick_file(){
println!("当前选择的文件:{:?}",file);
self.imgpath=file.display().to_string();
};
}
上述代码中,FileDialog::new()是rfd库中文件夹选择的用法,看rfd的官方示例: 我们在实例中,将获取的图像路径传递给我们设置的变量imgpath.
当我们获取到了图像的本地路径之后,就可以使用iced的image部件来显示图像,我们首先来看下iced中image的定义:
#[derive(Debug)]
pub struct Image<Handle = image::Handle> {
handle: Handle,
width: Length,
height: Length,
content_fit: ContentFit,
filter_method: FilterMethod,
rotation: Rotation,
opacity: f32,
}
我们主要关注的就是handle这个参数,它的类型是Handle,可以理解为图像的原始数据来源,Handle在iced中的定义:
pub enum Handle {
/// A file handle. The image data will be read
/// from the file path.
///
/// Use [`from_path`] to create this variant.
///
/// [`from_path`]: Self::from_path
Path(Id, PathBuf),
/// A handle pointing to some encoded image bytes in-memory.
///
/// Use [`from_bytes`] to create this variant.
///
/// [`from_bytes`]: Self::from_bytes
Bytes(Id, Bytes),
/// A handle pointing to decoded image pixels in RGBA format.
///
/// Use [`from_rgba`] to create this variant.
///
/// [`from_rgba`]: Self::from_rgba
Rgba {
/// The id of this handle.
id: Id,
/// The width of the image.
width: u32,
/// The height of the image.
height: u32,
/// The pixels.
pixels: Bytes,
},
}
可以看到,Handle定义了三种获取图像原始数据的方式,一种是直接从图像路径获取,一种是图像的字节数组获取,一种是从rgba数据获取。 我们在本文显然是使用第一种方式,即图像路径来获取handle,用于显示。iced官方给了典型的image使用代码:
image("ferris.png")
这是最简单的应用,不过我们在实例使用时,因为希望能调整图像的大小与透明度,所以可以这样写:
let img_handle=image::Handle::from_path(self.imgpath.clone());
let img1=image(img_handle).opacity(opacity).width(img_w).height(img_h);
其中,opacity用于调整透明度,width和height用于调整图像尺寸。 我们来看下实际显示效果:
有了之前slider调整text文字大小的经验,此处就比较简单了,因为我们已经获取了图像路径,显然也就能获取图像尺寸了,这里,我们使用外部的image库来处理。image库的功能还是很强大的,看下它支持的图像处理格式: 为了方便管理,我们将获取图像尺寸封装为一个函数,与此前的img_to_icon函数放到一起,使用时直接调用即可:
///
/// 获取图片大小
///
/// 例:jpg or png -> (w,h)
pub fn get_img_size(path:&str) ->(f32,f32){
if path != "" {
let img_re=eximg::open(path);
match img_re{
Ok(img)=>{
return (img.width() as f32,img.height() as f32)
},
Err(e)=>{
let res=MessageDialog::new()
.set_title("错误")
.set_level(rfd::MessageLevel::Error)
.set_buttons(rfd::MessageButtons::Ok)
.set_description(&e.to_string())
.show();
if res == rfd::MessageDialogResult::Yes{
return (0.0,0.0)
}
return (0.0,0.0)
}
}
//return (img.width() as f32,img.height() as f32)
}
return (0.0,0.0)
}
let img_size=imgprocess::get_img_size(&self.imgpath);
看下完整的view函数:
let btn_load=button(text("加载图片").size(15)).width(80).height(40)
.on_press(Message::BtnLoad);
let sl1=slider(
0.0..=1.0,
self.slidervalue,
Message::SliderChange)
.height(40).width(200)
.step(0.01);
let opacity= self.slidervalue;
let tt1=text("透明度:").size(15);
let tt2=text(format!("{:.2}",opacity)).size(15);
let row1=row![tt1,sl1,tt2,].spacing(10)
.align_y(iced::Center);
let slider_scale=slider(0.1..=2.0,self.slidervalue2,Message::SliderChange2)
.height(40).width(200)
.step(0.01);
let tt3=text("缩放:").size(15);
let tt4=text(format!("{:.2}",self.slidervalue2)).size(15);
let row2=row![tt3,slider_scale,tt4,].spacing(10);
let tt_imgpath=text("当前图片路径:").size(15);
let tt_imgpath2=text(format!("{}",self.imgpath)).size(15);
let row3=row![tt_imgpath,tt_imgpath2,].spacing(10);
let img_handle=image::Handle::from_path(self.imgpath.clone());
let img_size=imgprocess::get_img_size(&self.imgpath);
let img_w=img_size.0 * self.slidervalue2;
let img_h=img_size.1 * self.slidervalue2;
let tt_imgsize=text(format!("图片大小:{:?}",img_size)).size(15);
//let row4=row![].spacing(10);
let img1=image(img_handle).opacity(opacity).width(img_w).height(img_h);
//let cont_color=Color::from_rgb(120.0, 120.0, 0.0);
let cont_color2=iced::color!(0xE9E7E7,0.5);//#E9E7E7FF
let cont_img=container(img1)
.width(1000).height(1000)
.align_x(iced::Center).align_y(iced::Center)
.style(move |t|styles::mycontainerstyle(t, cont_color2));
column![
btn_load,
row1,
row2,
row3,
tt_imgsize,
cont_img,
].align_x(iced::Center)
.padding(20)
.into()
它整体显示效果如下:
先来看看动态演示: 结合前文slider的使用,本文介绍了如何在iced中导入图像、显示图像以及调整图像,当然也是很简单的示例。比如导入按钮,后续将会使用菜单替代.
最后此篇关于[rustGUI][iced]基于rust的GUI库iced(0.13)的部件学习(03):图像的导入、显示、调整(暨image部件的使用介绍)的文章就讲到这里了,如果你想了解更多关于[rustGUI][iced]基于rust的GUI库iced(0.13)的部件学习(03):图像的导入、显示、调整(暨image部件的使用介绍)的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
刚读 this article ,这让我很想知道加快谈判阶段的好处。我正在开发一个应用程序,其中我使用的是仅使用 ICE 的第三方实用程序,但最终将在下一个版本中升级为涓流 ICE。升级需要相当多的代
您好,我使用 Zeroc Ice 通信库 (v3.4.2) 编写了一个 C# 客户端/服务器应用程序。 我正在从服务器传输一系列对象,然后以表格格式在客户端中显示它们。很简单。 我定义了以下切片类型
未捕获的 DOMException:构建“RTCPeerConnection”失败:当 URL 方案为“turn”或“turns”时,需要用户名和凭据。 我收到这个错误是因为我使用的是 ice 服务器
我的本地计算机上的 WiX 遇到一些奇怪的问题。该问题是间歇性的,但在对解决方案进行几次重建后,WiX 项目开始抛出 ICE 验证错误。 如果我进入 AppData\Local\Temp 文件夹并
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 5 个月前。 Improve this q
我使用 WiX 3.5 构建了一个安装程序。安装程序使用 VB6 合并模块。我总是从与此类似的灯光中收到很多错误消息: error LGHT0204: ICE03: Table: Class Colu
我正在尝试使用 TFS 将 WiX 集成到我的自动构建解决方案中2010 运行于 Windows Server 2008 R2。一切似乎都很简单,然后我明白了: light.exe: Error ex
我正在遵循 Licode page 上的指南 我已经在 Ubuntu 14.04 上安装了所有内容。 我已经在 licode_config.js 中为 licode 和 erizo Controlle
我正在使用 WebRTC API 在运行在 chrome 浏览器上的两台 PC 之间进行视频通话。我的观察是只有当我连接到互联网时才会生成 ICE 候选者,否则不会生成 ICE 候选者。为什么会这样?
我的树表中有很多命令链接,我动态构建它们,如果我想在单击一个命令链接时更改它的颜色,所有命令链接都会更改它们的颜色,我不知道如何做更改此指定链接的颜色,因为我不知道她的号码或 ID,如果有人知道答案,
假设我有这样的功能(在 Javascript 中): 功能乐趣(success_cb,error_cb){ 变量结果; 尝试 { 结果 = function_that_calculates_resul
不要在 safari 中工作示例 https://github.com/Kurento/kurento-tutorial-node/tree/master/kurento-one2many-call
视频通话在同一网络内工作正常。问题是在其他网络上调用计算机时,远程视频不显示。在 chrome 上,我在控制台中没有收到任何错误,但在 firefox 控制台上,我收到了“ICE Failure”。
我遇到了 ZeroC ICE 字典语法的新手问题。这是我尝试过的方法,但似乎没有任何效果。 /*What I want to make >*/ dictionary> FlightSchedule;
此菜单不适用于任何 IE 版本。我怎样才能让它工作? 我也想添加过渡,有没有办法添加它以便从顶部缓慢打开? http://tinyurl.com/7rxskdj #nmenu {width:700px
我正在开发两个对等点之间的信号系统,并注意到 RTCPeerConnection.onicecandidate 事件没有触发。我检查了 iceGatheringState,它总是返回"new",这意味
我想利用 ICE Faces fileInput 控件根据用户选择的文件为网页上的输入字段输入文件路径和文件名。如何在不实际执行任何文件传输操作的情况下捕获这些属性? 最佳答案 我相信真正的答案是你不
我已经阅读了 RFC 5389 和 RFC 5245 以及更新的 RFC 8445。我了解 STUN 如何返回服务器反身地址或中继地址。请求被发送到 STUN 服务器。 我的基本问题是关于使用 STU
我正在开发一个 iOS 应用程序,使用 WebRTC 与 RTCDataChannel 进行点对点数据通信。当两个设备都在同一个 wifi 网络上时,我已经设法让一切正常工作,但是当我将 1 放在移动
我正在尝试建立 b/w 两个对等点的 p2p 音频/视频连接。以下:Getting started with WebRTC . 它在我家的两台 PC 之间的 LAN 环境中运行良好,但在运行时抛出错误
我是一名优秀的程序员,十分优秀!