У вас несколько проблем.
Формат
A Изображение в формате PNG не является растровым изображением , даже если оно a растровое изображение .
A поток в MSDN сообщает:
Нет стандартного формата буфера обмена для PNG.
Вы можете зарегистрировать свой собственный формат, но тогда только вы можете распознать буфер обмена.Если вы используете стандартное растровое изображение или формат файла, то больше приложений могут принимать ваши данные.
Обработка ошибок
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
в файл создает BMP, который Paint может прочитать, но данные буфера обмена по-прежнему недействительны.Пытаясь отладить различия, я столкнулся с низкоуровневыми сбоями в библиотеке , что говорит о том, что она может быть не готова для общего использования, несмотря на номер версии 2.x.
Iполагать, что основная проблема заключается в том, что
Windows ожидает
Дескриптор растрового изображения (HBITMAP
).
A BITMAP
- это структура с набором информации о растровом изображении, такой как ширина и высота.Вероятно, это отличается от формата растрового изображения на диске.
Представляется вероятным, что подгонка растровых данных к этому ожидаемому формату будет иметь большое значение для решения проблемы.
Другой путьэто использовать CF_DIB
вместо CF_BITMAP
.В отличие от связанного поста на форуме выше, CF_DIB
ожидает указатель на BITMAPINFO
, который имеет поле BITMAPINFOHEADER
.Это ссылка на сжатие BI_PNG
, которое может позволить вам отправлять PNG без выполнения преобразований.
См. Также: