You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rust中使用FLTK实现图像随Frame同步缩放问题求助

问题分析与解决方案

你的代码核心问题在于获取图片引用的方式错误,导致无法真正修改图片尺寸:

  • s.image()返回的是图片的不可变引用,而scale()方法需要修改图片本身的像素数据,必须使用可变引用才能生效。你之前的回调虽然触发了,但scale()调用根本没有改变图片的实际尺寸,所以窗口缩放后图片依然保持原样。

修正后的代码(推荐方案)

直接使用image_mut()获取图片的可变引用,确保scale()能真正修改图片:

use fltk::{frame::Frame, window, app, prelude::*, image::JpegImage};

fn main() {
    let app = app::App::default().with_scheme(app::Scheme::Gtk);

    let mut main_win = window::Window::default()
        .with_size(800, 600)
        .center_screen()
        .with_label("PhotoTest");

    let mut img_frame = Frame::default().size_of_parent();
    let img = JpegImage::load("flower.jpg").unwrap();
    img_frame.set_image(Some(img));
    
    img_frame.resize_callback(|s,_,_,_,_| {
        // 通过image_mut()获取可变引用,才能执行修改操作
        if let Some(mut img) = s.image_mut() {
            img.scale(s.w(), s.h(), true, true);
        }
        s.redraw();
    });

    main_win.make_resizable(true);
    main_win.end();
    main_win.show();
    app.run().unwrap();
}

备选方案(适配旧版FLTK)

如果你的fltk-rs版本较低(低于0.19),没有image_mut()方法,可以用Rc<RefCell>包裹图片,手动管理可变引用并重新设置到Frame:

use fltk::{frame::Frame, window, app, prelude::*, image::JpegImage};
use std::rc::Rc;
use std::cell::RefCell;

fn main() {
    let app = app::App::default().with_scheme(app::Scheme::Gtk);

    let mut main_win = window::Window::default()
        .with_size(800, 600)
        .center_screen()
        .with_label("PhotoTest");

    let mut img_frame = Frame::default().size_of_parent();
    let img = Rc::new(RefCell::new(JpegImage::load("flower.jpg").unwrap()));
    img_frame.set_image(Some(img.clone().into_inner()));
    
    img_frame.resize_callback(move |s,_,_,_,_| {
        let mut img_ref = img.borrow_mut();
        img_ref.scale(s.w(), s.h(), true, true);
        // 重新设置图片,确保Frame识别到尺寸变化
        s.set_image(Some(img_ref.clone()));
        s.redraw();
    });

    main_win.make_resizable(true);
    main_win.end();
    main_win.show();
    app.run().unwrap();
}

关键说明

  • scale()方法的后两个参数:true(保持比例)、true(允许图片超过原始尺寸),这和你想要的height:100%自适应效果匹配。
  • 调用redraw()是为了让Frame立即刷新,显示缩放后的图片。

内容的提问来源于stack exchange,提问作者Eduardo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 20:05:27