在日常工作中,尤其是快速处理信息时,我们可能需要对屏幕上的图像进行快速分析,比如解析截图中的文字、标志、图表等内容。然而,将截图内容粘贴到特定软件中进行分析往往繁琐耗时,不利于提升工作效率。
为了解决这个问题,我们可以创建一个工具,能够让用户通过快捷键轻松实现图像的内容分析,并即时获得结果。这篇文章介绍了如何利用Python及其相关库来实现这个需求。
实现步骤
- 导入必要的库:首先,我们导入了一些用于实现不同功能的Python库,如
keyboard
、pyperclip
、requests
、ctypes
等。这些库将分别用于捕获键盘和鼠标事件、请求API、显示结果等。
import keyboard
import pyperclip
import requests
import ctypes
import json
import tempfile
import os
from PIL import ImageGrab, Image
from pynput import keyboard as pynput_keyboard
from pynput import mouse
import base64
- 定义图像捕获逻辑:
- 通过监听用户的键盘和鼠标动作,当用户按下
Ctrl
并进行鼠标右键滚动操作时,程序会捕获系统剪贴板中的图像。 - 通过
PIL.ImageGrab.grabclipboard()
函数,可以检测到用户在剪贴板中复制的图像对象。
- 通过监听用户的键盘和鼠标动作,当用户按下
def on_ctrl_mouse_right():
# Get clipboard content
img = ImageGrab.grabclipboard()
if isinstance(img, Image.Image):
# Save image to a temporary file
temp_file = tempfile.NamedTemporaryFile(delete=False, suffix=".png")
img.save(temp_file.name, "PNG")
temp_file.close()
try:
# Upload the image and get analysis from OpenAI
response_content = analyze_image(temp_file.name)
if response_content:
show_message(response_content)
finally:
os.unlink(temp_file.name) # Remove the temporary file after use
- 分析图片内容:
- 将剪贴板中的图片存储到一个临时文件中,以便进一步的处理。
- 通过Python的
requests
库,向OpenAI的API发送一个请求,传递图片的内容。程序将使用base64
对图像进行编码,然后将其嵌入请求中。
def analyze_image(image_path):
try:
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer YOUR_API_KEY", # 请替换为你的API密钥
}
with open(image_path, "rb") as img_file:
img_data = img_file.read()
img_base64 = base64.b64encode(img_data).decode("utf-8")
data = {
"model": "gpt-4o",
"messages": [
{
"role": "user",
"content": [
{"type": "text", "text": "帮我分析图片中的内容"},
{
"type": "image_url",
"image_url": {
"url": f"data:image/jpeg;base64,{img_base64}"
},
},
],
}
],
"max_tokens": 300,
}
response = requests.post(API_ENDPOINT, headers=headers, json=data)
if response.status_code == 200:
response_json = response.json()
return response_json["choices"][0]["message"]["content"]
else:
print("Error in API response:", response.text)
return None
except Exception as e:
print("Error while analyzing image:", e)
return None
- 显示分析结果:
- 使用
ctypes.windll.user32.MessageBoxW()
来弹出一个对话框,显示图像分析的结果,方便用户立即查看。
- 使用
def show_message(content):
ctypes.windll.user32.MessageBoxW(0, content, "Image Analysis Result", 0x40 | 0x1)
- 监控用户输入事件:
- 利用
pynput
库监听用户的键盘和鼠标事件,通过定义的回调函数捕获Ctrl
键的状态和鼠标滚动的事件,确保只有在用户按住Ctrl
键并进行特定鼠标操作时才会触发图片分析。
- 利用
# Listener state variables
ctrl_pressed = False
# Define key press and release actions
def on_press(key):
global ctrl_pressed
if key == pynput_keyboard.Key.ctrl_l or key == pynput_keyboard.Key.ctrl_r:
ctrl_pressed = True
def on_release(key):
global ctrl_pressed
if key == pynput_keyboard.Key.ctrl_l or key == pynput_keyboard.Key.ctrl_r:
ctrl_pressed = False
# Define mouse actions
def on_move(x, y):
pass
def on_click(x, y, button, pressed):
pass
def on_scroll(x, y, dx, dy):
global ctrl_pressed
if ctrl_pressed and dy != 0: # Detect right scroll while holding ctrl
on_ctrl_mouse_right()
# Start listeners for keyboard and mouse
keyboard_listener = pynput_keyboard.Listener(on_press=on_press, on_release=on_release)
mouse_listener = mouse.Listener(on_move=on_move, on_click=on_click, on_scroll=on_scroll)
keyboard_listener.start()
mouse_listener.start()
# Keep the script running
keyboard_listener.join()
mouse_listener.join()
原理分析
这段代码的核心在于结合键盘和鼠标的事件监听机制,通过pynput
库实现对特定组合操作的响应。当用户按下Ctrl
键并进行鼠标滚轮的滚动操作时,程序首先检查剪贴板中是否存在图片数据,如果存在则将其保存为临时文件,随后利用OpenAI API对图片内容进行分析。
图片的分析是通过向API发送POST
请求来完成的,图像数据首先被转换为base64
格式,然后以JSON形式通过请求传递给远程服务器。API返回的结果则包含了对图片的分析内容,如文字描述或识别结果。为了实现无缝体验,程序直接通过弹窗的方式将结果展示给用户。
实现中的关键技术点
- 键盘与鼠标事件监听:通过
pynput
库实现对键盘与鼠标动作的监听,使得用户可以通过简单的组合键操作触发复杂的功能。 - 剪贴板图像捕获:利用
PIL.ImageGrab
库实现对系统剪贴板的图像抓取,这样用户无需进行额外操作,直接使用复制后的图片进行分析。 - API请求与响应处理:使用
requests
库与远程API进行交互,实现图片分析请求的发送和结果处理。 - 临时文件管理:利用
tempfile
库创建临时文件来存储图像,避免对系统文件造成干扰,同时确保图片数据能够在处理完成后被自动清理。
完整代码如下:
import keyboard
import pyperclip
import requests
import ctypes
import json
import tempfile
import os
from PIL import ImageGrab, Image
from pynput import keyboard as pynput_keyboard
from pynput import mouse
import base64
# OpenAI API endpoint and key
API_ENDPOINT = "http://XXXXX.frogchou.com/v1/chat/completions"
API_KEY = "sk-XXXXXXXXXXXXXX"
PROMPT = "帮我分析图片中的内容"
# Monitor user's keyboard and mouse event
def on_ctrl_mouse_right():
# Get clipboard content
img = ImageGrab.grabclipboard()
if isinstance(img, Image.Image):
# Save image to a temporary file
temp_file = tempfile.NamedTemporaryFile(delete=False, suffix=".png")
img.save(temp_file.name, "PNG")
temp_file.close()
try:
# Upload the image and get analysis from OpenAI
response_content = analyze_image(temp_file.name)
if response_content:
show_message(response_content)
finally:
os.unlink(temp_file.name) # Remove the temporary file after use
def analyze_image(image_path):
try:
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {API_KEY}",
}
with open(image_path, "rb") as img_file:
img_data = img_file.read()
img_base64 = base64.b64encode(img_data).decode("utf-8")
data = {
"model": "gpt-4o",
"messages": [
{
"role": "user",
"content": [
{"type": "text", "text": PROMPT},
{
"type": "image_url",
"image_url": {
"url": f"data:image/jpeg;base64,{img_base64}"
},
},
],
}
],
"max_tokens": 300,
}
response = requests.post(API_ENDPOINT, headers=headers, json=data)
if response.status_code == 200:
response_json = response.json()
return response_json["choices"][0]["message"]["content"]
else:
print("Error in API response:", response.text)
return None
except Exception as e:
print("Error while analyzing image:", e)
return None
# Function to display the response content
def show_message(content):
ctypes.windll.user32.MessageBoxW(0, content, "Image Analysis Result", 0x40 | 0x1)
# Listener state variables
ctrl_pressed = False
# Define key press and release actions
def on_press(key):
global ctrl_pressed
if key == pynput_keyboard.Key.ctrl_l or key == pynput_keyboard.Key.ctrl_r:
ctrl_pressed = True
def on_release(key):
global ctrl_pressed
if key == pynput_keyboard.Key.ctrl_l or key == pynput_keyboard.Key.ctrl_r:
ctrl_pressed = False
# Define mouse actions
def on_move(x, y):
pass
def on_click(x, y, button, pressed):
pass
def on_scroll(x, y, dx, dy):
global ctrl_pressed
if ctrl_pressed and dy != 0: # Detect right scroll while holding ctrl
on_ctrl_mouse_right()
# Start listeners for keyboard and mouse
keyboard_listener = pynput_keyboard.Listener(on_press=on_press, on_release=on_release)
mouse_listener = mouse.Listener(on_move=on_move, on_click=on_click, on_scroll=on_scroll)
keyboard_listener.start()
mouse_listener.start()
# Keep the script running
keyboard_listener.join()
mouse_listener.join()
小结
通过这种方式,我们可以实现一个便捷的图片内容分析工具,解决了在复杂环境下需要频繁分析图片内容的低效问题。通过简单的快捷键操作,用户可以快速获取图片的内容分析结果,从而更高效地完成工作任务。这种方法特别适用于需要对图像中的文本或图形进行快速理解的场景,如会议记录、网页截图内容的提取等。
希望这篇文章对大家在开发类似功能时有所帮助。如果你有任何改进的想法或问题,欢迎在评论区与我讨论!