2025-01-13解决 `tao` 设置窗口图标问题

解决 tao 设置窗口图标问题

日期: [填写日期]
作者: [你的名字]
关键词: tao, 窗口图标, PNG, Rust


问题描述

在使用 tao 设置窗口图标时,直接加载 .ico 文件总是存在问题。经过尝试,改用加载 .png 文件成功解决了问题。


解决方案

关键代码

以下是加载 .png 文件并设置为窗口图标的关键代码:

use image::{io::Reader as ImageReader, GenericImageView};
use tao::window::Icon;
use log::{error, info};

/// 从 PNG 文件加载图标
fn load_icon_from_png(path: &str) -> Option<Icon> {
    // 使用 image 库加载 PNG 文件
    let img = match ImageReader::open(path) {
        Ok(reader) => reader.decode().ok()?,
        Err(e) => {
            error!("Failed to open PNG file '{}': {}", path, e);
            return None;
        }
    };

    // 转换为 RGBA 格式
    let rgba = img.to_rgba8();

    // 创建 tao::window::Icon
    match Icon::from_rgba(rgba.to_vec(), rgba.width(), rgba.height()) {
        Ok(icon) => {
            info!(
                "Icon loaded successfully: {}x{}",
                rgba.width(),
                rgba.height()
            );
            Some(icon)
        }
        Err(e) => {
            error!("Failed to create icon: {}", e);
            None
        }
    }
}

fn main() {
    // 加载 PNG 文件作为图标
    let icon = load_icon_from_png(concat!(
        env!("CARGO_MANIFEST_DIR"),
        "/src/assets/fav.png"
    ))
    .expect("Failed to load icon");

    // 创建事件循环和窗口
    let event_loop = EventLoop::new();
    let window = WindowBuilder::new()
        .with_title("fav")
        .with_window_icon(Some(icon)) // 设置窗口图标
        .build(&event_loop)
        .unwrap();
}

实现细节

  1. 加载 PNG 文件
    使用 image 库的 ImageReader::open 方法加载 PNG 文件,并将其解码为图像数据。

  2. 转换为 RGBA 格式
    将图像数据转换为 RGBA 格式,这是 tao::window::Icon 所需的格式。

  3. 创建图标
    使用 Icon::from_rgba 方法将 RGBA 数据转换为 tao::window::Icon。

  4. 设置窗口图标
    在创建窗口时,通过 with_window_icon 方法设置窗口图标。

注意事项

  1. 依赖库
    需要添加 image 库作为依赖:
[dependencies]
image = "0.24"
  1. 日志记录
    使用 log 库记录加载图标的成功或失败信息。

  2. 图标尺寸
    确保 PNG 文件的尺寸适合作为窗口图标(通常为 16x16、32x32 或 64x64 像素)。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。