截图自动保存

应用场景

工作中经常会有需要截图发给别人的情况,一般我们都是使用常用的通讯APP截图,比如QQ、微信、企业微信、飞书等等。这些APP都有着丰富的截图功能,可以满足我们的使用需求。

实际痛点

但是偶尔也会有一些不一样的截图需求,例如,我需要截图并且保存到文件夹,以方便后续使用,这时候我们一般的做法都是,使用APP截图功能,将图片粘贴到聊天框,再右键图片选择保存到本地,这样的话,如果只有一两张或者三五张图片其实都还好,但是如果有很多需要截图并保存的,那就需要我们费时费力的去一张张保存,太浪费时间。

所以我们能不能有什么其他截图的方法,或者安装一个什么APP来解决这个问题,在网络上搜索了一下,确实有很多很优秀的APP可以完美实现这个功能。

不过我们还是想能不能自己做一个出来,实现这简单的需求之外,也给我们增加点经验值。

所以我就借助现在比较流行的AI工具帮忙写了一个(水平太次,自己写不出来,只能是找AI帮忙了),起码需求是我写的,四舍五入,程序就是我写的

代码

import win32clipboard
import win32con
from PIL import Image
from io import BytesIO
import os
import uuid
import hashlib
import threading
import time
import tkinter as tk
from tkinter import filedialog, messagebox, StringVar

def get_image_hash(image):
    """计算图片的哈希值"""
    image_byte_arr = BytesIO()
    image.save(image_byte_arr, format='PNG')
    image_byte_arr = image_byte_arr.getvalue()
    return hashlib.md5(image_byte_arr).hexdigest()

def check_clipboard(folder_path, saved_hashes, running, status_var, interval):
    """检测剪贴板中的图片并保存"""
    while running[0]:
        win32clipboard.OpenClipboard()
        try:
            if win32clipboard.IsClipboardFormatAvailable(win32con.CF_DIB):
                data = win32clipboard.GetClipboardData(win32con.CF_DIB)
                bitmap_header = data[:14]
                bitmap_info_header = data[14:54]
                bitmap_data = data[54:]

                full_bitmap_data = bitmap_header + bitmap_info_header + bitmap_data

                try:
                    image = Image.open(BytesIO(full_bitmap_data))
                    image_hash = get_image_hash(image)

                    if image_hash not in saved_hashes:
                        file_name = f"{uuid.uuid4()}.png"
                        file_path = os.path.join(folder_path, file_name)
                        image.save(file_path)
                        print(f"图片已保存到: {file_path}")
                        saved_hashes.add(image_hash)
                    else:
                        print("图片已存在,未保存")
                except Exception as e:
                    print(f"无法识别图像文件: {e}")
        finally:
            win32clipboard.CloseClipboard()
        time.sleep(interval)

def start_detection(folder_path_var, saved_hashes, running, status_var, interval_var):
    """开始检测剪贴板中的图片"""
    if not folder_path_var.get():
        messagebox.showwarning("警告", "请选择一个文件夹")
        return
    if running[0]:
        messagebox.showwarning("警告", "检测已经开始")
        return
    try:
        interval = float(interval_var.get())
        if interval <= 0:
            raise ValueError("间隔时间必须为正数")
    except ValueError as e:
        messagebox.showwarning("警告", f"无效的间隔时间: {e}")
        return

    running[0] = True
    status_var.set(f"正在检测... (间隔时间: {interval}秒)")
    threading.Thread(target=check_clipboard, args=(folder_path_var.get(), saved_hashes, running, status_var, interval)).start()

def stop_detection(running, status_var):
    """停止检测剪贴板中的图片"""
    if not running[0]:
        messagebox.showwarning("警告", "检测尚未开始")
        return
    running[0] = False
    status_var.set("检测已停止")
    print("检测已停止")

def select_folder(folder_path_var):
    """选择并设置文件夹路径"""
    folder_path = filedialog.askdirectory()
    if folder_path:
        folder_path_var.set(folder_path)

def main():
    # 创建主窗口
    root = tk.Tk()
    root.title("剪贴板图片检测与保存")

    # 用于存储选择的文件夹路径
    folder_path_var = StringVar(root)
    folder_path_var.set("")

    # 用于存储已经保存过的图片的哈希值
    saved_hashes = set()

    # 用于控制检测是否开始
    running = [False]

    # 用于显示检测状态
    status_var = StringVar(root)
    status_var.set("检测未开始")

    # 用于存储检测间隔时间
    interval_var = StringVar(root)
    interval_var.set("1")

    # 文件夹选择按钮
    folder_button = tk.Button(root, text="选择文件夹", command=lambda: select_folder(folder_path_var))
    folder_button.pack(pady=10)

    # 文件夹路径显示标签
    folder_label = tk.Label(root, textvariable=folder_path_var)
    folder_label.pack(pady=5)

    # 检测间隔时间输入框
    interval_label = tk.Label(root, text="检测间隔时间(秒):")
    interval_label.pack(pady=5)
    interval_entry = tk.Entry(root, textvariable=interval_var)
    interval_entry.pack(pady=5)

    # 开始检测按钮
    start_button = tk.Button(root, text="开始检测", command=lambda: start_detection(folder_path_var, saved_hashes, running, status_var, interval_var))
    start_button.pack(pady=10)

    # 停止检测按钮
    stop_button = tk.Button(root, text="停止检测", command=lambda: stop_detection(running, status_var))
    stop_button.pack(pady=10)

    # 检测状态显示标签
    status_label = tk.Label(root, textvariable=status_var)
    status_label.pack(pady=10)

    # 运行主循环
    root.mainloop()

if __name__ == "__main__":
    main()

这里直接就是一个我调试了几遍能够正常运行的程序,是一个小的窗体结构,因为涉及到将来可能要给其他人用,所以就弄了个用户界面(因为别人电脑上不一定有环境)

运行结果

界面我就没搞了,实用最重要!!!

功能说明

  1. 程序运行之后就是显示这个界面
  2. 选择文件夹:顾名思义,找一个你想保存的位置,这样你每次截图就会自动把图片存进去了
  3. 检测间隔时间:我们不需要程序以太快的间隔进行循环检测,置于太快会怎样,我也没测试。不过这里直接默认就是1秒间隔,你也可以看你自己的需求进行修改,尽量不要出现你截图的频率很快,但是检测间隔设置的太长了,导致你的上一张图片还没有保存,你就已经截图下一张图片了
  4. 开始检测、停止检测:增加了一个手动控制是否开始检测的开关,不用的时候节约一点系统性能
  5. 正在检测提示:一开始没有这个,但是我在实用的时候发现,当我切换几次界面之后我就忘了我是不是打开了检测,导致中间停止了我都不知道,结果我中间截得几张图都没保存

使用方法

如果你有python环境,并且想看看程序是怎么运行的,可以直接复制上面的代码,我用的是pycharm,直接运行就好,可能会有库需要你自己安装一下

如果你想直接使用,也可以下载我打包好的版本,

友情提示:没有经过优化,所以启动可能会有点慢,介意的话就算了。

下载链接:截图自动检测与保存.exe官方版下载丨最新版下载丨绿色版下载丨APP下载-123云盘

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值