网站添加模块,网站开发公司的生产,搜索引擎优化的基本手段,wordpress 全文检索注#xff1a;此文适合于对rust有一些了解的朋友 iced是一个跨平台的GUI库#xff0c;用于为rust语言程序构建UI界面。 想要了解如何构建简单窗口的可以看本系列的第一篇#xff1a; Rust UI开发#xff1a;使用iced构建UI时#xff0c;如何在界面显示中文字符
本篇是系…注此文适合于对rust有一些了解的朋友 iced是一个跨平台的GUI库用于为rust语言程序构建UI界面。 想要了解如何构建简单窗口的可以看本系列的第一篇 Rust UI开发使用iced构建UI时如何在界面显示中文字符
本篇是系列第二篇主要解决一个问题就是为窗口添加图标icon。
注窗口图标在其他语言中应该是非常容易实现的但iced是一个发展中的库很多方面还不成熟我在用iced自己的方法测试window图标花了很多时间效果还不好所以特意记录此篇一来做个记录方便以后回看二来给其他有这方面问题的朋友做个参考。
我们先来看一下iced中对于窗口参数设置里icon的定义
/// The icon of the window. pub icon: OptionIcon,icon参数是一个枚举枚举类型是Icon。 再去看Icon的定义
/// An window icon normally used for the titlebar or taskbar.
#[derive(Debug, Clone)]
pub struct Icon {rgba: Vecu8,size: Sizeu32,
}可以看到这里Icon的数据是rgba数据是一种图像的数据类型。 rgba是rgb的基础上另外增加了一个a阿尔法通道表示透明度信息。 也就是说rgb是[u8,u8,u8],而rgba是[u8,u8,u8,u8]。这里u8指2的8次方即256种颜色值0-255。 总的来说你只要知道在这里Icon是{rgbasize}组合的数据形式。
所以如果我们要设置这个icon图标我们知道图片应该是rgba格式的且设置一个尺寸如4848,6464,类似这种。
先看图像的格式通常如果读取一张图片数据应该是rgb所以需要转换。 看下面的代码
let img_byteinclude_bytes!(img3.jpg); //println!(this is:{:?},img_byte);let icoicon::from_rgba(img_byte.to_owned().into(), 32, 29);let ico_filematch ico{Ok(file)file,Err(error)panic!(error is {},error),};这段代码是利用include_bytes方法将图像的像素转为一个字节数组。 然后调用iced::window::icon的from_rgba函数这个函数就是构建一个Icon对象以rgba的形式从其他色彩类型转化。 他返回的是一个Result数据所以需要进行错误处理然后利用Someico_file返回枚举类型的数据格式即 Option。
icon:Some(ico_file) 这个方法是可行的我在测试中可以正常启动窗口并显示图片但是有些问题首先就是对图片有要求在测试中遇到两个问题 一是图片包含像素长度不对编译器提示无法被4整除也就是不能分成rgba四个通道所以会报错。 二是加入图片像素长度可以了但你的尺寸size设置有问题举例说明图片像素字节加起来是120个除以4就是30但你的尺寸设置为3232这就不行如果把尺寸修改为56就可以了。
关于上面这个方法首先它是能够实现在窗口上加载图标的但是目前我还没有搞清楚图片的像素数据就要是怎么匹配的导致我在测试中发现虽然能显示图片但图片显然和原始图片的图案对不上也就是像素可能错位了。
第二个方法
所以我建议使用第二个方法第二个方法是使用第三方库来处理图片得到一个完整的rgba图片数据。 这里会用到image库github地址 https://github.com/image-rs/image/tree/master 要使用这个库需要在cargo.toml文件里添加依赖
image*
num-complex*也可以指定版本号。
然后导入
extern crate image;
extern crate num_complex;来看代码 //第二种获取rgba图片的方法利用Image库let img2image::open(../iced_test/src/img3.jpg); let img2_pathmatch img2 {Ok(path)path,Err(error)panic!(error is {},error),};let img2_fileimg2_path.to_rgba8();let ico2icon::from_rgba(img2_file.to_vec(), 64, 64);let ico2_filematch ico2{Ok(file)file,Err(error)panic!(error is {},error),};这里有个注意的地方就是image库的open函数打开图像文件其参数是图片的路径但是必须是 “…/iced_test/src/img3.jpg” 这种形式如果你写成 “.iced_test/src/img3.jpg” 或者 “img3.jpg” image好像会识别错误它识别的相对路径必须在前面加上: …/ image::open函数返回的是一个Result数据 ResultDynamicImage, ImageError 我们利用match返回DynamicImage数据这个DynamicImage是image的一个枚举数据它拥有转换的功能我们使用to_rgba8()函数返回一个rgbaImage数据rgbaIMage包含 ImageBufferRgba, Vec
得到ImageBuffer可以看到里面包含rgba我们使用 to_vec()转为适合的格式这样ico2就得到想要的rgba格式的Icon了但ico2还是一个result。我们用match取出Icon即可。
let ico2icon::from_rgba(img2_file.to_vec(), 64, 64); let ico2_filematch ico2{ Ok(file)file,Err(error)panic!(error is {},error),};然后window的Settings中 icon:Some(ico2_file)这样就可以了看一下实际窗口效果 图标图片 实际窗口 可以看到窗口的icon图标正常显示了。