在指定窗口中显示图像
(winname: &str, mat: &Mat)
| 22 | |
| 23 | /// 在指定窗口中显示图像 |
| 24 | pub fn imshow(winname: &str, mat: &Mat) -> Result<()> { |
| 25 | // 1. 格式转换 |
| 26 | let buffer = mat_to_u32_buffer(mat)?; |
| 27 | let width = mat.cols as usize; |
| 28 | let height = mat.rows as usize; |
| 29 | |
| 30 | // 2. 获取全局锁 |
| 31 | let mut manager = WINDOW_MANAGER |
| 32 | .lock() |
| 33 | .map_err(|_| anyhow!("Failed to lock window manager"))?; |
| 34 | |
| 35 | // 3. 检查是否需要重建窗口 |
| 36 | let need_recreate = if let Some(wrapper) = manager.get(winname) { |
| 37 | // 获取当前窗口的尺寸 |
| 38 | let (win_w, win_h) = wrapper.0.get_size(); |
| 39 | // 如果尺寸不匹配(说明分辨率变了),标记为需要重建 |
| 40 | // 注意:这里容忍一点点误差,或者严格匹配 |
| 41 | win_w != width || win_h != height |
| 42 | } else { |
| 43 | true // 窗口不存在,肯定要创建 |
| 44 | }; |
| 45 | |
| 46 | if need_recreate { |
| 47 | // 如果存在旧窗口,先移除(Drop 会自动关闭窗口) |
| 48 | if manager.contains_key(winname) { |
| 49 | manager.remove(winname); |
| 50 | } |
| 51 | |
| 52 | // 创建新窗口 |
| 53 | let mut window = Window::new( |
| 54 | winname, |
| 55 | width, |
| 56 | height, |
| 57 | WindowOptions { |
| 58 | resize: true, // 允许用户手动缩放 |
| 59 | ..WindowOptions::default() |
| 60 | }, |
| 61 | ) |
| 62 | .map_err(|e| anyhow!("Failed to create window: {}", e))?; |
| 63 | |
| 64 | // 初始更新 |
| 65 | window |
| 66 | .update_with_buffer(&buffer, width, height) |
| 67 | .map_err(|e| anyhow!("Initial update failed: {}", e))?; |
| 68 | |
| 69 | // 存入管理器 |
| 70 | manager.insert(winname.to_string(), SendWindow(window)); |
| 71 | } else { |
| 72 | // 窗口已存在且尺寸匹配,直接更新 |
| 73 | if let Some(wrapper) = manager.get_mut(winname) { |
| 74 | wrapper |
| 75 | .0 |
| 76 | .update_with_buffer(&buffer, width, height) |
| 77 | .map_err(|e| anyhow!("Window update failed: {}", e))?; |
| 78 | } |
| 79 | } |
| 80 | |
| 81 | Ok(()) |
no test coverage detected