rust语言 (1.88) egui (0.32.1) 学习笔记(逐行注释)(二十五)窗口图标 / 任务栏图标

发布于:2025-09-08 ⋅ 阅读:(22) ⋅ 点赞:(0)

一、窗口图标 / 任务栏图标设置

  • 关键点,图片类型必须与设置类型相同,以下常用类型
    • image::ImageFormat::Ico
    • image::ImageFormat::Jpeg
    • image::ImageFormat::Png
    • image::ImageFormat::Gif
    • image::ImageFormat::WebP
    • image::ImageFormat::Bmp
  • 图片宽高要相同,代码中要写实际的图片宽高,否则显示可能错乱
use eframe::egui;
use egui::viewport::IconData;
use image;
use std::io::Cursor;
use std::sync::{Arc, Mutex};
use std::{fs, thread};

// 加载ICO图标文件到字节数组(假设文件位于项目上级目录的c_128.ico)
let icon_data = include_bytes!("../c_128.ico");

// 使用image库加载ICO文件:
// 1. 通过Cursor将字节数组转为可读取流
// 2. 指定格式为ICO,其他图片格式做相应修改
// 3. 解包结果(失败时panic)
// 4. 转换为RGBA8格式(带透明度通道)
let img = image::load(Cursor::new(icon_data), image::ImageFormat::Ico)
    .unwrap()
    .to_rgba8();

// 创建IconData结构体实例:
// - rgba: 将图像原始像素数据转为Vec<u8>并克隆
// - width/height: 设置为128x128(需与实际图像尺寸匹配)
let mut icon = IconData {
    rgba: img.into_raw().to_vec(),
    width: 128,
    height: 128,
};

// 配置eframe窗口选项:
// - viewport: 使用默认ViewportBuilder并设置图标
//   - with_icon: 将图标包装成Arc智能指针(线程安全引用计数)
// - ..Default::default(): 保留其他选项的默认值
let options = eframe::NativeOptions {
    viewport: egui::ViewportBuilder::default()
        .with_icon(Arc::new(icon)),
    ..Default::default()
};

二、方法整合

// 返回IconData结构体,文件路径字符串和宽高参数
fn load_icon_rgba(pathstr: &str, width: u32, height: u32) -> IconData {
   // 使用标准库fs模块读取路径指定的文件内容到字节数组
    let icon_data = fs::read(pathstr).unwrap();
    // 使用image库加载图片数据
    // 将字节数组包装成Cursor(内存读取器)作为输入源
    // 指定图片格式为PNG,其他图片格式做相应修改
    let image = image::load(Cursor::new(icon_data), image::ImageFormat::Png)
        .unwrap()
        .to_rgba8();   // 解包加载结果并将图片转换为RGBA8格式(每像素4字节)
    IconData {         // 构造IconData结构体实例
        rgba: image.into_raw().to_vec(),  // 将图像数据转换为原始字节向量
        width,                    // 图片的宽度,必须和图片一致
        height,                   // 图片的高度,必须和图片一致
    }
}

// 其他代码省略......

let rgba = load_icon_rgba("./c_800.png", 800, 800);  // 传入项目目录下文件,宽高与图片一致
let options = eframe::NativeOptions {
	viewport: egui::ViewportBuilder::default()
        .with_icon(rgba)        // 设置窗口图标       
    ..Default::default()        // 保留其他选项的默认值
};

注意:两个代码,图片文件均在项目文件夹下,注意路径写法有所不同!!!


网站公告

今日签到

点亮在社区的每一天
去签到