基于python环境进行图片批量加水印和发送QQ信息等

252 阅读2分钟

本文为了应付形式主义的烦扰,编写了一个可以自动加水印的程序,可以批量加水印,批量发送信息等等

image.png

image.png

代码如下:

(python环境)

import cv2
from matplotlib import pyplot as plt
import numpy as np
from io import BytesIO
from PIL import Image
import time
import random
import math
import os
import re
import win32gui
import win32api
import win32con
import win32clipboard
f = []
for filename in os.listdir(r'D:\youxi'):#获取目标文件,有多少张图片
    if filename.endswith('jpg') or filename.endswith('png'):
        f.append(filename)
print(f)
f.sort(key=lambda x:int(x[0:-5]),reverse=True)#对图片进行列表排序,取第一张最晚发送的
print(f)
# img3 = cv2.imread('D:/youxi/20221014153724.jpg')
img1 = cv2.imread('D:\youxi{}'.format(f[0]),cv2.IMREAD_COLOR)#目标图片
img2 = cv2.imread('zhuifzdr.png',cv2.IMREAD_COLOR)#水印图片


#融合两张图片,小图片背景必须是白的,需要二值化
#Load two images

#I want to put logo on top-left corner, So I create a ROI

# img2 = cv2.resize(img2,(500,300))

rows, cols, channels = img2.shape
roi = img1[0:rows, 0:cols]
#Now create a mask of logo and create its inverse mask
img2gray = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)
img2gray = ~img2gray
# add a threshold
ret,mask = cv2.threshold(img2gray, 180, 255, cv2.THRESH_BINARY_INV)
mask_inv = cv2.bitwise_not(mask)
# Now black-out the area of logo in ROI
img1_bg = cv2.bitwise_and(roi, roi, mask=mask_inv)
# Take only region of logo from logo image.
img2_fg = cv2.bitwise_and(img2, img2, mask=mask)
dst = cv2.add(img1_bg,img2_fg)
img1[0:rows, 0:cols] = dst
# cv2.imshow('res',img1)
# print(int(time.time()))
fi = 'C:/Users/ycl/Desktop/TXT/{}.jpg'.format(int(time.time()))
cv2.imwrite(fi,img1)

# cv2.waitKey(0)
# cv2.destroyAllWindows()


path = 'D:\youxi{}'.format(f[0])
os.remove(path)
print("添加水印成功,图片已删除!")


def copy_image_to_clipboard(img_path: str):
    '''输入文件名,执行后,将图片复制到剪切板'''
    image = Image.open(img_path)
    output = BytesIO()
    image.save(output, 'BMP')
    data = output.getvalue()[14:]
    output.close()
    win32clipboard.OpenClipboard()
    win32clipboard.EmptyClipboard()
    win32clipboard.SetClipboardData(win32clipboard.CF_DIB, data)
    win32clipboard.CloseClipboard()

# 发送的消息
msg = '测试'
# 窗口名字
name = "自己的网名"#记得打开窗口在桌面
# 将测试消息复制到剪切板中
# w.OpenClipboard()
# w.EmptyClipboard()
# w.SetClipboardData(win32con.CF_UNICODETEXT, msg)
# w.CloseClipboard()
copy_image_to_clipboard(fi)
time.sleep(2)
# 获取窗口句柄
handle = win32gui.FindWindow(None, name)
if handle == 0:
    print('未找到窗口!')
# while 1==1:
    # 显示窗口
win32gui.ShowWindow(handle, win32con.SW_SHOW)
time.sleep(1)
if 1 == 1:
    # 填充消息
    win32gui.SendMessage(handle, 770, 0, 0)
    # 回车发送消息
    win32api.keybd_event(17, 0, 0, 0)#按下Ctrl键
    win32api.keybd_event(13, 0, 0, 0)#按下enter键
    win32api.keybd_event(13, 0, win32con.KEYEVENTF_KEYUP, 0)
    win32api.keybd_event(17, 0, win32con.KEYEVENTF_KEYUP, 0)
    win32gui.SendMessage(handle, win32con.WM_KEYDOWN, win32con.VK_RETURN, 0)
print("图片成功发送!")

至于批量使用,我们加上for循环就可以啦, 至于为什么要做这个小项目,那是因为某些院系形式主义泛滥,每天都要上报照片和网站,还要加上姓名班级学号院系,本人为了应付这些罢了