python画图脚本

Python 在windows上跑图色脚本?简单又好玩,自己编写一个自动化脚本 大家好 我又来开新坑了,如图这次准备用python弄个简单脚本(根据图色判断进行键鼠操作) 1.老规矩 先安排运行环境 编译平台:pycharm python版本最低请安装3.5.2 最高3.8(

Python 在windows上跑图色脚本?简单又好玩,自己编写一个自动化脚本

大家好 我又来开新坑了,如图这次准备用python弄个简单脚本(根据图色判断进行键鼠操作)

1.老规矩 先安排运行环境

编译平台:pycharm
python版本最低请安装3.5.2 最高3.8(有些模块有要求最好这么来)

这是我初步import的模块库,不用一次性装好,咱们后面用到啥就装啥 这边先给个图片看个大概

import cv2,sys,win32api, win32con,win32gui,win32gui,win32print,time,json,pywebio,os,shutil,ctypes
from ctypes import wintypes
import numpy as np
# from PyQt5.QtWidgets import QApplication
from PIL import Image, ImageGrab
from pywebio.output import *
from pywebio import start_server
from pywebio.input import *
from pyautogui import *
from sys import _getframe
from builtins import print as _print
# from pynput.keyboard import Controller, Key, Listener

在这里插入图片描述

一、首先搞定图片的获取(像素点的获取)

思路:先搞定截屏;再搞定截指定窗口的图片;读图片;获取图片数据;获取图片指定像素点的RGB或者16进制色值

(1)通过PIL模块截图

安装库:Pillow(PIL)库

from PIL import Image, ImageGrab

def cutphoto():
    global img
    img = ImageGrab.grab((x1, y1, x2, y2))
    img.save("1.png")
    return img
cutphoto()

(x1,y1,x2,y2)为截图范围的坐标点
注意这里ImageGrab.grab函数里面的参数填的是tuple类型的(带上括号)
运行后可以在当前目录下生成一个 1.png 的图片

(2)获取指定窗口的坐标并截图(非后台,这里只直接置顶窗口截图)

安装库:Pillow(PIL)库、pywin32(win32)库
工具:lookhandles 2.3(获取窗口句柄的工具)
把放大镜移到窗口上就可以看到窗口信息,我们通过这个工具可以快速找到自己想要的窗口信息
需要用到的窗口信息包括:
窗口句柄、窗口类名、窗口标题

这里主要看 父类信息
在这里插入图片描述
这里就先以系统自带的画图工具为例
窗口句柄:2887048
窗口类名:MSPaintApp
窗口标题:无标题-画图

思路清晰的同学们应该可以感觉到,这里只有类目是固定的,咱们就用类名为依据去找窗口

 import win32api, win32con,win32gui,win32gui,win32print
 handle =win32gui.FindWindow(classname, name)#句柄
 #这里classname就是类名,name是标题名字,二者填其一即可
 #例如handle =win32gui.FindWindow('MSPaintApp', None)

运行:

import win32api, win32con,win32gui,win32gui,win32print
handle =win32gui.FindWindow('MSPaintApp', None)
print(handle)

打印结果为:2887048

后面成型就是这样(看备注基本就了解了):

import win32api, win32con,win32gui,win32gui,win32print,time
handle = win32gui.FindWindow('MSPaintApp', None)#句柄
win32gui.SendMessage(handle, win32con.WM_SYSCOMMAND, win32con.SC_RESTORE, 0)  # 发送还原最小化窗口的信息
(x1, y1, x2, y2) = get_window_pos_handle(handle)#根据句柄获取应用窗口坐标
win32gui.SetWindowPos(handle, win32con.HWND_TOPMOST, -7,0, x2 - x1+14, y2 - y1+7, win32con.SWP_SHOWWINDOW)  # 移动左上角并置顶
x1, y1, x2, y2 = 0, 0, x2 - x1, y2 - y1  # 重置应用窗口坐标
time.sleep(0.001)  # 延迟防截图黑屏

运行结果就是 画图工具自动移动到窗口左上角并顶置
PS:因为windows的程序窗口有毛玻璃效果 win32的自动坐标需要-7像素,宽度+7x2=14像素,高度+7像素 保证不会改变原窗口大小

将其封装成一个初始化函数init() 如下所示

import win32api, win32con,win32gui,win32gui,win32print,time
def init(name=None,classname=None,handles=None):
    global x1, y1, x2, y2, handle,keepscreenflag,keepscreenflag2
    keepscreenflag = False#保持屏幕全局参数1
    keepscreenflag2 = False#保持屏幕全局参数2
    if name == None and classname == None and handles == None:#3个参数全为None时 默认截取全屏
        print('init():init value empty,cut the whole screen')
        hDC = win32gui.GetDC(0)
        wide = win32print.GetDeviceCaps(hDC, win32con.DESKTOPHORZRES)#获取全屏的宽度
        high = win32print.GetDeviceCaps(hDC, win32con.DESKTOPVERTRES)#获取全屏的窗口高度
        x1, y1, x2, y2 = 0, 0, wide, high  # 重置应用窗口坐标
        time.sleep(0.001)  # 延迟防截图黑屏
        return keepscreenflag,keepscreenflag2#保持屏幕全局参数
    else:
        handle =handles or win32gui.FindWindow(classname, name)#句柄 没填句柄则按类名或者标题名锁定句柄
        win32gui.SendMessage(handle, win32con.WM_SYSCOMMAND, win32con.SC_RESTORE, 0)  # 发送还原最小化窗口的信息
        (x1, y1, x2, y2) = get_window_pos_handle(handle)#根据句柄获取应用窗口坐标
        win32gui.SetWindowPos(handle, win32con.HWND_TOPMOST, -7,0, x2 - x1+14, y2 - y1+7, win32con.SWP_SHOWWINDOW)  # 移动左上角并置顶
        x1, y1, x2, y2 = 0, 0, x2 - x1, y2 - y1  # 重置应用窗口坐标
        time.sleep(0.001)  # 延迟防截图黑屏
        return keepscreenflag, keepscreenflag2#保持屏幕全局参数

如此,结合(1)、(2)两节 就可以完成窗口的初始化 和 截图功能

(3)根据坐标点获取色值

安装库:Pillow(PIL)库、pywin32(win32)库
工具:取色工具 大漠、叉叉助手、触动精灵等 随便啥取色工具都可以

未完待续。。。

知秋君
上一篇 2024-07-09 13:12
下一篇 2024-07-09 12:48

相关推荐