当前位置: 首页 > news >正文

rust - 将windows剪贴板的截图保存为png

本文提供了将windows系统的截图另存为png格式图片的方法。

添加依赖

cargo add clipboard-win
cargo add image
cargo add windows

配置修改windows依赖特性

[dependencies]
image = "0.25.0"[target.'cfg(windows)'.dependencies]
windows = "0.51.1"
clipboard-win = "5.3.0"[dependencies.windows]
version = "0.51"
features = ["Win32_Foundation","Win32_System_DataExchange","Win32_Graphics_Gdi","Win32_System_LibraryLoader","Win32_UI_WindowsAndMessaging","Win32_System_DataExchange","Win32_System_Registry",
]

模拟windows截图并另存为png文件

use clipboard_win::formats::Bitmap;
use clipboard_win::{Clipboard, Getter, Setter};
use core::{mem, ptr};
use image::{codecs::png::PngEncoder, GenericImageView, ImageEncoder, ImageFormat,
};
use std::env;
use std::io::Write;
use std::{fs,io::{BufReader, BufWriter, Cursor},
};
use windows::Win32::Graphics::Gdi::{BITMAPFILEHEADER, BITMAPINFOHEADER};const INFO_HEADER_LEN: usize = mem::size_of::<BITMAPINFOHEADER>();
const FILE_HEADER_LEN: usize = mem::size_of::<BITMAPFILEHEADER>();#[test]
fn test_to_png() {// 读取bitmap文件let image_path = env::current_dir().unwrap().join("tests/test-image.bmp");let test_image_bytes = std::fs::read(image_path).expect("Read test image");// 打开剪贴板let _clip = Clipboard::new_attempts(10).expect("Open clipboard");// 保存到剪贴板模拟截图Bitmap.write_clipboard(&test_image_bytes).expect("To set image");// 从剪贴板读取截图let mut output: Vec<u8> = Vec::new();let _ = Bitmap.read_clipboard(&mut output);// 获得位图的大小(在栈上申请一块未初始化内存)let mut info_header = mem::MaybeUninit::<BITMAPINFOHEADER>::uninit();let info_header = unsafe {ptr::copy_nonoverlapping(output.as_ptr().add(FILE_HEADER_LEN),info_header.as_mut_ptr() as _,INFO_HEADER_LEN,);// 把T的所有权返回,编译器会主动对T调用dropinfo_header.assume_init()};let bitmap_width = info_header.biWidth;let bitmap_height = info_header.biHeight;assert_eq!(bitmap_width, 750);assert_eq!(bitmap_height, 300);// 将数组转换为BufReader对象,并读取位图信息let buf_reader = BufReader::new(Cursor::new(output));let img = image::load(buf_reader, ImageFormat::Bmp).unwrap();// 转换为png格式let mut png_file_content = Vec::new();let buff_writer = BufWriter::new(&mut png_file_content);let encoder = PngEncoder::new(buff_writer);let _ = encoder.write_image(&img.as_bytes().to_vec(),img.dimensions().0,img.dimensions().1,img.color().into(),);// 另存为png文件let png_path = env::current_dir().unwrap().join("tests/test-image.png");let mut file = fs::File::create(png_path).unwrap();file.write_all(png_file_content.as_slice()).unwrap();
}
http://www.lryc.cn/news/320888.html

相关文章:

  • pyflink1.18.0 报错 TypeError: cannot pickle ‘_thread.lock‘ object
  • 算法学习系列(四十一):Flood Fill算法
  • Re62:读论文 GPT-2 Language Models are Unsupervised Multitask Learners
  • stm32-编码器测速
  • 全国各省市县统计年鉴/中国环境统计年鉴/中国工业企业数据库/中国专利数据库/污染排放数据库
  • 【LAMMPS学习】二、LAMMPS安装(2)MacOS和Win安装
  • 如何解决网络中IP地址发生冲突故障?
  • 机器学习常用框架
  • 计算机网络——物理层(信道复用技术)
  • 【Qt问题】使用QSlider创建滑块小部件无法显示
  • Linux--Shell脚本安装 httpd 和 修改IP
  • mysql 常见问题
  • 考研机试题
  • Java基础知识总结(6)
  • JAVA基础—关于Java的反射机制
  • Hive中的explode函数、posexplode函数与later view函数
  • 北京市委统战部领导一行莅临百望云视察调研
  • 使用Python进行数据库连接与操作SQLite和MySQL【第144篇—SQLite和MySQL】
  • How to manage Python environment based on virtualenv in Ubuntu 22.04
  • 一款基于 SpringCloud 开发的AI聊天机器人系统,已对接GPT-4.0,非常强大
  • C语言自定义库
  • 目标检测常见数据集格式(YOLO、VOC、COCO)
  • 搭建 es 集群
  • Android弹出通知
  • 如何用 UDP 实现可靠传输?并以LabVIEW为例进行说明
  • 【任职资格】某大型商业金融银行任职资格体系搭建项目纪实
  • 如何利用IP地址分析风险和保障网络安全
  • 轧钢自动化中的智能仪器:监控、控制和优化新视角
  • 第十四届蓝桥杯省赛C++B组题解
  • 语音控制模块_雷龙发展