gpt4 book ai didi

windows - 如何在 Rust 中将图像写入 Windows 剪贴板

转载 作者:行者123 更新时间:2023-11-29 08:29:05 56 4
gpt4 key购买 nike

我想使用 Rust 将本地镜像放入剪贴板。我用了clipboard-winimage crate 。我的代码如下,但是不起作用。

extern crate clipboard_win;
extern crate image;

use clipboard_win::{formats, Clipboard};
use image::GenericImageView;

fn main() {
let img = image::open("C:\\Users\\Crash\\Desktop\\20190405221505.png").unwrap();
Clipboard::new()
.unwrap()
.set(formats::CF_BITMAP, &img.raw_pixels());
}

执行后,粘贴板里好像有内容,但是Ctrl+V后什么也没有显示。我该如何更正此代码?

最佳答案

你有多个问题。

格式

A PNG format image不是 bitmap format image ,即使它是 a bitmap .

A thread on MSDN状态:

There isn't a standardized clipboard format for PNG.

You can register your own format, but then only you can recognize the clipboard. If you use the standard bitmap or file format then more applications can accept your data.

错误处理

Clipboard::set可能会失败并返回一个 Result你需要处理这个案子。编译器甚至告诉过你:

warning: unused `std::result::Result` that must be used
--> src\main.rs:11:5
|
11 | / Clipboard::new()
12 | | .unwrap()
13 | | .set(formats::CF_BITMAP, &data);
| |________________________________________^
|
= note: #[warn(unused_must_use)] on by default
= note: this `Result` may be an `Err` variant, which should be handled

不要忽略警告,尤其是尝试调试问题时。


不幸的是,这是我得到的:

use clipboard_win::{formats, Clipboard}; // 2.1.2
use image::ImageOutputFormat; // 0.21.0

fn main() {
let img = image::open("unicorn.png").unwrap();

let mut data = Vec::new();
img.write_to(&mut data, ImageOutputFormat::BMP)
.expect("Unable to transform");

Clipboard::new()
.unwrap()
.set(formats::CF_BITMAP, &data)
.expect("Unable to set clipboard");
}

data 写入文件会生成 Paint 可以读取的 BMP,但剪贴板数据仍然无效。在尝试调试差异时,我遇到了 low-level crashes in the library ,这表明尽管有 2.x 版本号,但它可能还没有准备好用于一般用途。

我认为根本问题在于

Windows 期望

A handle to a bitmap (HBITMAP).

A BITMAP是一个结构,包含一组关于位图的信息,例如宽度和高度。这可能与位图的磁盘格式不同。

将位图数据调整为这种预期格式似乎对解决问题大有帮助。

另一个途径是研究使用 CF_DIB 而不是 CF_BITMAP。与上面链接的论坛帖子相反,CF_DIB 需要一个指向 BITMAPINFO 的指针它有一个 BITMAPINFOHEADER field 。这引用了 BI_PNG 压缩,这可能允许您在不执行转换的情况下提交 PNG。

另见:

关于windows - 如何在 Rust 中将图像写入 Windows 剪贴板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55545157/

56 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com