- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想使用 Rust 将本地镜像放入剪贴板。我用了clipboard-win和 image 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/
我是一名优秀的程序员,十分优秀!