做网站获取ip,百度网盘官网,四川网站建设seo优化,公众号里的功能怎么开发前言 本文是在rust的GUI库iced中在窗口显示动态图片GIF格式图片的一种方法。
环境配置 系统#xff1a;window 平台#xff1a;visual studio code 语言#xff1a;rust 库#xff1a;iced、image
概述
在iced中#xff0c;提供了image部件#xff0c;从理论上说…前言 本文是在rust的GUI库iced中在窗口显示动态图片GIF格式图片的一种方法。
环境配置 系统window 平台visual studio code 语言rust 库iced、image
概述
在iced中提供了image部件从理论上说image是支持gif图片的但是如果你直接将gif的图片路径提供给image获取图片的handle数据然后在UI上显示这个image是无法显示动态图片的通常这种情况下只会显示gif图片的第一帧。
看下面的示例 上面这张gif图片如果直接使用下面的显示方式
let imghandleimage::Handle::from_path(self.imgfile); let img1image(imghandle).content_fit(iced::ContentFit::Contain);效果如下 如上图的左边image部件只会显示这个gif的第一帧。而右边的图片则是动态的下面我就来说一下让gif动态显示的方法。
事实上这个方法是一种间接的方法iced库的作者提供了一个方法即使用Subscription来订阅windowframe事件
let sub_ficed::window::frames().map(Message::Tick);这个事件会根据当前系统硬件来刷新它触发的就是窗口的重绘。 它返回的数据是Instant是iced中的time的时刻数据即当前的时间片。
所以我们根据这个实时刷新的机制就可以来显示动态的图形包括gif。 具体逻辑是这样的先使用image库来获取gif图片的底层数据
let gfstd::io::BufReader::new(std::fs::File::open(..\\pidpid\\imgout\\pidpid.gif).unwrap()); let mut g1eximg::codecs::gif::GifDecoder::new(gf).unwrap();let g2g1.into_frames().collect_frames().expect(msg);如上g2是gif图片的数据集合其类型是Vec Frame,Frame即gif的每一帧图片。 我们通过索引来获取g2中的每一帧Frame然后将Frame转为Vec u8格式即图片转为字节数组格式。
这样一来我们就可以使用iced中的image部件的from_pixels函数来通过字节数组显示图片
let imghandle2image::Handle::from_pixels(200, 200, self.pixpix.clone()); let img2image(imghandle2).content_fit(iced::ContentFit::Contain);这样我们就通过将gif图片分割然后将每一帧单独显示到image部件再通过订阅windowframe来修改gif数据组的索引以此来显示gif的不同帧 let gfstd::io::BufReader::new(std::fs::File::open(..\\pidpid\\imgout\\pidpid.gif).unwrap()); let mut g1eximg::codecs::gif::GifDecoder::new(gf).unwrap();let g2g1.into_frames().collect_frames().expect(msg);if self.pixnum 7{self.pixnum0;}self.pixpixg2[self.pixnum].buffer().to_vec();self.pixnum 1;这就是间接实现iced中显示动态gif图片的一种方法看下实际演示