rust语言 (1.88) egui (0.32.2) 学习笔记(逐行注释)(二十八)使用图片控件显示图片

一、添加依赖

bash 复制代码
egui_extras={version="*",features=["default","all_loaders"]}

二、注册图像加载器到egui上下文

rust 复制代码
eframe::run_native(
    "加载图片", 
    options, 
    Box::new(|cc| {
        egui_extras::install_image_loaders(&cc.egui_ctx);
        Ok(Box::new(MyApp::new(cc)))
    }),
)?;
  • egui_extras::install_image_loaders(&cc.egui_ctx); :注册图像加载器到egui上下文,使程序能加载显示本地或网络图片(如PNG/JPG等)。若不添加:
    • 无法通过ui.image()显示外部图片
    • 图片相关功能(如纹理加载)会失效
    • 需手动实现图像解码逻辑

三、三种图片控件使用方式

1、ui.image(impl Into<ImageSource>),无法使用更多样式,实际调用的3

rust 复制代码
ui.image(egui::include_image!(
    "../1.jpg"
));

2、ui.add(egui::Image::new(impl Into<ImageSource>)),可以使用更多样式,实际调用的3

rust 复制代码
ui.add(egui::Image::new(egui::include_image!(
    "../1.jpg"
)));

3、egui::Image::new(impl Into<ImageSource>).ui(ui),可以使用更多样式,1、2都是调用的本方法

rust 复制代码
egui::Image::new(egui::include_image!(
    "../1.jpg"
)).ui(ui);

四、图片加载方式

1、从Url加载图片

rust 复制代码
egui::Image::new("file://image/img/10.jpeg").ui(ui);
egui::Image::new("https://image.maigoo.com/upload/images/20231207/11050416467_1320x880.jpg_1024_1024.jpg").ui(ui);

2、从字节数据加载

rust 复制代码
egui::Image::new(egui::include_image!("../image/img/13.jpg")).ui(ui);
egui::Image::from_bytes("bytes://image/img/15.webp", std::fs::read("./image/img/15.webp").unwrap()).ui(ui);

const IMG_BYTES: &[u8] = include_bytes!("../image/img/20.png");
egui::Image::from_bytes("bytes://20.png", IMG_BYTES).ui(ui);

3、从纹理加载

  • 纹理加载是指,将图片数据上传到GPU显存中生成纹理对象,渲染时由着色器直接采样纹理数据。
  • 纹理加载适合频繁绘制的场景(如游戏、动态UI),因为GPU对纹理的渲染效率远高于CPU处理原始字节数据。
rust 复制代码
let img = image::open("./image/img/21.jpg").ok().unwrap().to_rgba8();  // 加载图片并转换为RGBA8格式
let size = [img.width() as _, img.height() as _];          // 获取图片宽高,类型为u32,as _ 自动类型推断为usize
let texture=ctx.load_texture(
    "./image/img/21.jpg",                                  // 纹理id,通常用路径作为唯一标识
    egui::ColorImage::from_rgba_unmultiplied(size, &img),  //创建未预乘Alpha的RGBA图像数据
    egui::TextureOptions::LINEAR                           // 指定纹理缩放使用线性滤波(平滑效果)
);
egui::Image::new(&texture).ui(ui);                        // 显示纹理

五、图片的相关方法

1、常用方法汇总

rust 复制代码
.ui(ui)                                 // 将当前图片加载到当前ui
.max_width(100.0)                       // 最大宽度,保持比例
.max_height(100.0)                      // 最大高度,保持比例
.max_size(egui::Vec2::new(100.0,100.0)) // 图片最大尺寸
.show_loading_spinner(true)             // 显示加载旋转器
.fit_to_original_size(0.5)                       // 按比例缩放
.fit_to_exact_size(egui::Vec2::new(200.0,150.0)) // 精确尺寸控制,尺寸比例与原图比例不相同时,按照最小的尺寸按比例缩放
.alt_text("加载失败时,显示的文本")

2、bg_fill 背景色

(1)普通背景色

rust 复制代码
.bg_fill(egui::Color32::from_rgb(150,175,210))

(2)透明度的背景色

rust 复制代码
.bg_fill(egui::Color32::from_rgba_premultiplied(150, 175, 210, 200)) 

2、rotate 旋转

第一个参数:正数顺时针旋转,负数逆时针旋转,值为弧度,2π弧度=360度,1弧度≈57.3度。

第二个参数:旋转时围绕的中心,图片左上角坐标为:(0.0,0.0),右下角坐标为:(1.0,1.0),要是围绕中心点旋转使用:(0.5,0.5)

1、 不旋转

rust 复制代码
.rotate(0.0,(0.5,0.5).into())

2、围绕中心旋转180度、π弧度(倒转图片)

rust 复制代码
.rotate(3.1415926,(0.5,0.5).into())    // 中心可以使用:egui::Vec2::splat(0.5)

3、围绕(1.5,1.5)处,旋转180度、π弧度

rust 复制代码
.rotate(std::f32::consts::PI,(1.5,1.5).into()) 

rust标准库中的弧度值常量:

rust 复制代码
std::f32::consts::PI            // 180度,π弧度 = 3.14159265358979323846264338327950288_f32
std::f32::consts::TAU          // 360度,2π弧度 = 6.28318530717958647692528676655900577_f32
std::f32::consts::FRAC_PI_2    // 90度,π/2弧度 = 1.57079632679489661923132169163975144_f32
std::f32::consts::FRAC_PI_3    // 60度,π/3弧度 = 1.04719755119659774615421446109316763_f32
std::f32::consts::FRAC_PI_4     //45度,π/4弧度 = 0.785398163397448309615660845819875721_f32
std::f32::consts::FRAC_PI_6     //30度,π/6弧度 = 0.52359877559829887307710723054658381_f32
std::f32::consts::FRAC_PI_8   //22.5度,π/8弧度 = 0.39269908169872415480783042290993786_f32

3、corner_radius 圆角

rust 复制代码
.corner_radius(100.0)

4、tint 着色效果

rust 复制代码
.tint(egui::Color32::from_rgb(150, 0, 150))

5、uv 裁剪图片

rust 复制代码
// 中心部位
.uv(egui::Rect::from_min_max(
    egui::pos2(0.25, 0.25),
    egui::pos2(0.75, 0.75),
))

6、其他处理

rust 复制代码
let response = egui::Image::new("http").ui(ui);
if response.hovered(){ 显示加载状态提示......}           // 进一步处理相应
`
相关推荐
一又四分之一.2 小时前
高数基础知识(下)②
笔记
ZHANG8023ZHEN2 小时前
fMoE论文阅读笔记
论文阅读·笔记
Ro Jace3 小时前
文献阅读笔记:R&S电子战测试与测量技术文档
笔记
兔子不吃草~4 小时前
Transformer学习记录与CNN思考
学习·cnn·transformer
ZZHow10244 小时前
Maven入门_简介、安装与配置
java·笔记·maven
huli33204 小时前
pingora_web:首款基于 Cloudflare Pingora 的企业级 Rust Web 框架
rust
与己斗其乐无穷5 小时前
C++学习记录(8)list
学习
有谁看见我的剑了?5 小时前
k8s-容器探针和生命周期回调学习
学习·容器·kubernetes
Pomelo_刘金5 小时前
如何优雅地抽离 Rust 子工程:以 rumqttd 为例
rust