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)库 工具:取色工具 大漠、叉叉助手、触动精灵等 随便啥取色工具都可以

未完待续。。。

查看原文