当前位置: 首页 > 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();
}

相关文章:

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" clipb…...

pyflink1.18.0 报错 TypeError: cannot pickle ‘_thread.lock‘ object

完整报错 Traceback (most recent call last):File "/Users//1.py", line 851, in <module>ds1 = my_datastream.key_by(lambda x: x[0]).process(MyProcessFunction()) # 返回元组即: f0 f1 f2 三列File "/Users/thomas990p/bigdataSoft/minicondaarm/…...

算法学习系列(四十一):Flood Fill算法

目录 引言一、池塘计数二、城堡问题三、山峰和山谷 引言 关于这个 F l o o d F i l l Flood\ Fill Flood Fill 算法&#xff0c;其实我觉得就是一个 B F S BFS BFS 算法&#xff0c;模板其实都是非常相似的&#xff0c;只不过有些变形而已&#xff0c;然后又叫这个名字。关于…...

Re62:读论文 GPT-2 Language Models are Unsupervised Multitask Learners

诸神缄默不语-个人CSDN博文目录 诸神缄默不语的论文阅读笔记和分类 论文全名&#xff1a;Language Models are Unsupervised Multitask Learners 论文下载地址&#xff1a;https://cdn.openai.com/better-language-models/language_models_are_unsupervised_multitask_learner…...

stm32-编码器测速

一、编码器简介 编码电机 旋转编码器 A,B相分别接通道一和二的引脚&#xff0c;VCC&#xff0c;GND接单片机VCC&#xff0c;GND 二、正交编码器工作原理 以前的代码是通过触发外部中断&#xff0c;然后在中断函数里手动进行计次。使用编码器接口的好处就是节约软件资源。对于频…...

全国各省市县统计年鉴/中国环境统计年鉴/中国工业企业数据库/中国专利数据库/污染排放数据库

统计年鉴是指以统计图表和分析说明为主&#xff0c;通过高度密集的统计数据来全面、系统、连续地记录年度经济、社会等各方面发展情况的大型工具书来获取统计数据资料。 统计年鉴是进行各项经济、社会研究的必要前提。而借助于统计年鉴&#xff0c;则是研究者常用的途径。目前国…...

【LAMMPS学习】二、LAMMPS安装(2)MacOS和Win安装

2. LAMMPS安装 您可以将LAMMPS下载为可执行文件或源代码。 在下载LAMMPS源代码时&#xff0c;还必须构建LAMMPS。但是对于在构建中包含或排除哪些特性&#xff0c;您有更大的灵活性。当您下载并安装预编译的LAMMPS可执行文件时&#xff0c;您只能安装可用的LAMMPS版本以及这些…...

如何解决网络中IP地址发生冲突故障?

0、前言 本专栏为个人备考软考嵌入式系统设计师的复习笔记&#xff0c;未经本人许可&#xff0c;请勿转载&#xff0c;如发现本笔记内容的错误还望各位不吝赐教&#xff08;笔记内容可能有误怕产生错误引导&#xff09;。 1、个人IP地址冲突解决方案 首先winR&#xff0c;调出…...

机器学习常用框架

机器学习是人工智能的一个重要分支&#xff0c;它通过让计算机系统利用数据自我学习来改进任务执行的能力。在机器学习领域&#xff0c;有许多成熟的框架被广泛使用&#xff0c;这些框架提供了构建和训练机器学习模型的工具。以下是一些常用的机器学习框架&#xff1a; Tensor…...

计算机网络——物理层(信道复用技术)

计算机网络——物理层&#xff08;信道复用技术&#xff09; 信道复用技术频分多址与时分多址 频分复用 FDM (Frequency Division Multiplexing)时分复用 TDM (Time Division Multiplexing)统计时分复用 STDM (Statistic TDM)波分复用码分复用 我们今天接着来看信道复用技术&am…...

【Qt问题】使用QSlider创建滑块小部件无法显示

问题描述&#xff1a; 使用QSlider创建滑块小部件用于音量按钮的时候&#xff0c;无法显示&#xff0c;很奇怪&#xff0c;怎么都不显示 一直是这个效果&#xff0c;运行都没问题&#xff0c;但是就是不出现。 一直解决不了&#xff0c;最后我在无意中&#xff0c;在主程序中…...

Linux--Shell脚本安装 httpd 和 修改IP

shell脚本 关闭防火墙、安装httpd、启动httpd [rootnode11 ~]# mkdir shell[rootnode11 ~]# vim abc.sh #!/bin/bash#安装httpd服务#1、挂载 准备yum源 mount /dev/sr0 /mnt &> /dev/nulldf$(df -h | grep /dev/sr0 | awk {print $6})if [ "$df" "/mn…...

mysql 常见问题

1、count(*) 、 count(1) 和 count&#xff08;字段&#xff09;区别 在MySQL中&#xff0c;COUNT(*)、COUNT(1) 和 COUNT(字段) 是用于统计行数的函数&#xff0c;它们的主要区别在于&#xff1a; COUNT(*)&#xff1a;会统计符合条件的所有行的数量&#xff0c;不管这些行中…...

考研机试题

目录 头文件与STL动态规划最大数组子串和最长公共子序列最长连续公共子串最长递增子序列最大上升子序列和0-1背包多重背包多重背包问题 I整数拆分最小邮票最大子矩阵 数学问题朴素法筛素数线性筛素数快速幂 石子合并锯木棍并查集Dijkstra单源最短路Python进制转换(整数无限大)全…...

Java基础知识总结(6)

String类中常用的类方法&#xff1a; 方法名称描述format(String format, Object... args)使用指定的格式字符串和参数返回一个格式化字符串。 format - 格式字符串 args - 格式字符串中由格式说明符引用的参数。如果还有格式说明符以外的参数&#xff0c;则忽略这些额外的参数…...

JAVA基础—关于Java的反射机制

1. Java的反射机制是什么&#xff1f; 反射(reflection) 当我们谈及反射&#xff0c;可以将其比作正在照镜子的行为。就像你可以在禁止中看到自己的反射一样&#xff0c;程序在运行时可以检查自身的机构和行为。这意味这程序可以动态地了解自己地组成部分&#xff0c;比如类、…...

Hive中的explode函数、posexplode函数与later view函数

1.概述 在离线数仓处理通过HQL业务数据时&#xff0c;经常会遇到行转列或者列转行之类的操作&#xff0c;就像concat_ws之类的函数被广泛使用&#xff0c;今天这个也是经常要使用的拓展方法。 2.explode函数 2.1 函数语法 -- explode(a) - separates the elements of array …...

北京市委统战部领导一行莅临百望云视察调研

“当今时代&#xff0c;数字技术、数字经济是世界科技革命和产业变革的先机&#xff0c;是新一轮国际竞争重点领域”。 为了解数字标杆企业的发展现状&#xff0c;促进新质生产力与实体产业的协同与赋能&#xff0c;近日&#xff0c;北京市委统战部非公经济处处长王雷、副处长徐…...

使用Python进行数据库连接与操作SQLite和MySQL【第144篇—SQLite和MySQL】

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 使用Python进行数据库连接与操作&#xff1a;SQLite和MySQL 在现代应用程序开发中&#xf…...

How to manage Python environment based on virtualenv in Ubuntu 22.04

How to manage Python environment based on virtualenv in Ubuntu 安装使用创建环境激活环境安装软件包退出环境移除环境 安装 pip3 install virtualenv使用 创建环境 lwkqwfys:~$ mkdir ~/project/harbin lwkqwfys:~$ cd ~/project/harbin lwkqwfys:~/project/harbin$ vir…...

OpenLayers 可视化之热力图

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 热力图&#xff08;Heatmap&#xff09;又叫热点图&#xff0c;是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上&#xff0c;你可以使用apt包管理器来安装NFS服务器。打开终端并运行&#xff1a; sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享&#xff0c;例如/shared&#xff1a; sudo mkdir /shared sud…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

MySQL中【正则表达式】用法

MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现&#xff08;两者等价&#xff09;&#xff0c;用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例&#xff1a; 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

蓝桥杯3498 01串的熵

问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798&#xff0c; 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

《C++ 模板》

目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板&#xff0c;就像一个模具&#xff0c;里面可以将不同类型的材料做成一个形状&#xff0c;其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式&#xff1a;templa…...

排序算法总结(C++)

目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指&#xff1a;同样大小的样本 **&#xff08;同样大小的数据&#xff09;**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...