37 个版本
0.14.0 | 2024 年 3 月 30 日 |
---|---|
0.13.1 | 2022 年 9 月 16 日 |
0.12.3 | 2022 年 5 月 22 日 |
0.10.1 | 2021 年 11 月 19 日 |
0.6.2 | 2020 年 3 月 26 日 |
#104 in 图像
896 每月下载量
用于 12 crate
195KB
4K SLoC
show-image
show-image
是一个用于快速显示图像的库。它旨在作为编写图像处理代码的调试辅助工具。该库不旨在制作功能齐全的GUI,但您可以从创建的窗口中处理键盘事件。
支持的图像类型。
该库旨在支持尽可能多的不同数据类型,用于表示图像。为了保持依赖关系图尽可能小,必须使用功能标志显式启用对第三方库的支持。
目前,支持以下类型
- 此crate中的
Image
和ImageView
类型。 image::DynamicImage
和image::ImageBuffer
(需要"image"
功能)。tch::Tensor
(需要"tch"
功能)。raqote::DrawTarget
和raqote::Image
(需要"raqote"
功能)。
如果您认为缺少某种数据类型支持,请随时提交 PR 或在 GitHub 上创建问题。
全局上下文和多线程
该库使用一个运行事件循环的全局上下文。在可以使用任何 show-image
函数之前,必须初始化此上下文。此外,某些平台要求事件循环在主线程中运行。为了确保可移植性,所有平台都强制执行相同的限制。
在主线程中初始化全局上下文并运行事件循环的最简单方法是使用您主函数上的 main
属性宏。如果您想在全局上下文接管之前在主线程中运行一些代码,可以使用 run_context()
函数或其变体之一。请注意,您必须仍然从主线程调用这些函数,并且它们不会将控制权返回给调用者。
事件处理。
您可以使用 WindowProxy::add_event_handler()
或类似函数注册全局上下文线程中运行的事件处理器。您还可以直接使用上下文注册事件处理器以处理全局事件(包括所有窗口事件)。由于这些事件处理器在事件循环中运行,因此它们不应该在任意长时间内阻塞。
您还可以使用 WindowProxy::event_channel()
或 ContextProxy::event_channel()
接收事件。这些函数分别创建用于接收窗口事件或全局事件的新的通道。只要您在自己的线程中接收事件,您可以阻塞任意长时间。
保存显示的图像。
如果启用了 save
功能,窗口允许使用 Ctrl+S
或 Ctrl+Shift+S
保存显示的图像。第一个快捷键将打开文件对话框以保存当前显示的图像。第二个快捷键将直接使用图像名称在当前工作目录中保存图像。
图像将不包含任何覆盖。要保存包含覆盖的图像,请将 Alt
添加到快捷键:Ctrl+Alt+S
和 Ctrl+Alt+Shift+S
。
请注意,图像是在后台线程中保存的。为了确保不发生数据丢失,请调用 exit()
来终止进程,而不是 std::process::exit()
。这将确保在进程终止之前,后台线程已经连接。
示例 1:显示图像。
use show_image::{ImageView, ImageInfo, create_window};
#[show_image::main]
fn main() -> Result<(), Box<dyn std::error::Error>> {
let image = ImageView::new(ImageInfo::rgb8(1920, 1080), pixel_data);
// Create a window with default options and display the image.
let window = create_window("image", Default::default())?;
window.set_image("image-001", image)?;
Ok(())
}
示例 2:使用事件通道处理键盘事件。
use show_image::{event, create_window};
// Create a window and display the image.
let window = create_window("image", Default::default())?;
window.set_image("image-001", &image)?;
// Print keyboard events until Escape is pressed, then exit.
// If the user closes the window, the channel is closed and the loop also exits.
for event in window.event_channel()? {
if let event::WindowEvent::KeyboardInput(event) = event {
println!("{:#?}", event);
if event.input.key_code == Some(event::VirtualKeyCode::Escape) && event.input.state.is_pressed() {
break;
}
}
}
后端和 GPU 选择
该软件包使用 wgpu
进行渲染。您可以通过将 WGPU_BACKEND
环境变量设置为支持的值之一来强制选择特定的 WGPU 后端
primary
:使用平台的主后端(默认)。vulkan
:使用 vulkan 后端。metal
:使用 metal 后端。dx12
:使用 DirectX 12 后端。dx11
:使用 DirectX 11 后端。gl
:使用 OpenGL 后端。webgpu
:使用浏览器 WebGPU 后端。
您还可以通过设置 WGPU_POWER_PREF
环境变量来影响 GPU 选择
low
:优先使用低功耗 GPU(默认)。high
:优先使用高性能 GPU。
依赖关系
~14–52MB
~834K SLoC