python实现桌面自动化画图

前言

分享一个比较有趣的自动化项目,可以帮助实现将准备的图片画在桌面上,是实实在在的画出来。

预览一下效果

这个是在百度上找的图片

将图片进行二值化处理后的效果

通过画图工具画出来的效果。

核心代码

将图片进行二值化处理

from PIL import Image
import cv2
import numpy as np


def binaryzation():
    '''图片二值化'''
    #读取图片
    src = cv2.imread('picture/021.png')
    #灰度图像处理
    GrayImage = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)
    #二进制阈值化处理
    r, b = cv2.threshold(GrayImage, 100, 255, 8)  # 可选0,1,8,9,16,17

    # r, b = cv2.threshold(GrayImage)
    # print(b)
    yx = np.column_stack(np.where(b==0))
    print(yx)

    # 保存图片:就是把数组保存成图
    im = Image.fromarray(b)
    im.save("picture/020_2.png")
    #显示图像
    cv2.imshow("src", src)
    cv2.imshow("result", b)
    #等待显示
    cv2.waitKey(0)
    cv2.destroyAllWindows()



if __name__ == '__main__':
    binaryzation()

执行这步,可将图片进行二值化处理,, 处理后的效果

将图片的坐标点保存到文件中

import cv2
from PIL import Image
import sys
import numpy as np

class Site_File():
    def cut_image(self, image):
        '''切割图像'''
        width, height = image.size
        print(width, height)
        # item_width = int(width / 582)
        item_width = 1
        box_list = []
        # (left, upper, right, lower)
        for i in range(width):#0.01s为一段,8s=800个0.01s
            box = (i*item_width,0,(i+1)*item_width,height)
            box_list.append(box)

        image_list = [image.crop(box) for box in box_list] #crop用于切割图片
        print(len(image_list))
        return image_list


    def save_images(self, image_list):
        '''把切割图像保存到文件'''
        index = 1
        for image in image_list:
            # image.save(r'E:/project/wjs/demo/image/ima/'+str(index) + '.png', 'PNG')
            image.save('picture/ima20/'+str(index) + '.png', 'PNG')
            index += 1

    def create_file1(self, width):
        dic = {}
        x = 1
        for i in range(width):  # 循环次数为图片量
            # for i in range(350):
            #     img = cv2.imread('image/ima1/'+str(i+1) + '.png')
            img = cv2.imread('E:/project/wjs/draw/picture/ima20/' + str(i + 1) + '.png')
            # img = cv2.imread('E:/project/wjs/demo/image/ima1/35' + '.png')
            # 灰度图像处理
            hsv = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
            # 二进制阀值化处理
            # r, b = cv2.threshold(hsv, 180, 255, 9)

            yx = np.column_stack(np.where(hsv == 0))  # 0 为背景为黑  1为背景为白
            print(yx)
            length = len(yx)
            # 将连续的坐标点依次写入文件
            if length != 0:
                dic_dic = {}
                a_a = 1
                list1 = [yx[0][0]]
                # 判断是否连续,连续的以键值对存入字典
                for i in range(1, length):
                    if (yx[i][0] - list1[-1]) == 1:
                        list1.append(yx[i][0])
                    else:
                        print(list1)
                        dic_dic[a_a] = list1
                        a_a += 1
                        list1 = [yx[i][0]]
                    if i == length - 1:
                        dic_dic[a_a] = list1
                        dic[x] = dic_dic
                        dic_dic = {}
                        a_a += 1
            x += 1
        print(dic)

        with open('coord_file/020.txt', 'a+') as f:
            f.write(str(dic))

if __name__ == '__main__':
    file_path = "picture/020_2.png"
    image = Image.open(file_path) # 创建图片对象
    picture_file = Site_File()  # 创建对象
    image_list = picture_file.cut_image(image)
    # #image.show()
    picture_file.save_images(image_list)
    width, height = image.size
    # 保存文件
    picture_file.create_file1(width)

这段代码的意思,大概分为 首先将图片按照切分为分辨率大小的份数 然后通过循环读取坐标点,最后将这些坐标点记录在一个txt文件中。(图片二值化后只有黑色和白色,循环读取黑色点的坐标就可以将整个图片有黑色的区域通过坐标的方式记录到文件中,就可以读取图片中的有图像的坐标点)

通过pyautogui实现自动化画图

import pyautogui,time
time.sleep(3)


# 打开文件
with open('coord_file/013.txt', 'r') as f:
    data = eval(f.read())
# print(data)
# print(type(data))
def draw():
    '''进行画画'''
    for x, y_dic in data.items():
        x = x + 250
        for index in y_dic:
            # 如果长度只有3个以下连续,就依次点击
            if len(y_dic[index]) <= 3:
                for i in y_dic[index]:
                    y = i + 150
                    print(x, y)
                    pyautogui.click(x, y)
            # 连续坐标点长度大于三个,连接坐标点开头和结尾
            else:
                # for i in y_dic:

                y1 = y_dic[index][0] + 150
                print(x, y1)
                pyautogui.mouseDown(x, y1, button='left')
                y2 = y_dic[index][-1] + 150
                print(x, y2)
                pyautogui.moveTo(x, y2)
                pyautogui.mouseUp()

                    # pyautogui.mouseDown()
if __name__ == '__main__':
    draw()

这段代码,将txt的文件读出来实现自动画图。画图的最终效果

总结提醒:

画图的时候可以用电脑自带的画图工具,并将鼠标改为粉笔的状态,调整好画布的大小,运行起来就可以看到神奇的效果了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ming tian

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值