python photoshop自动化_你会用Python 搞定你的电子签名吗?

edfe6c5378c4f1ca517adb8fa95584d0.png

前言

在我们工作和生活中,你使用过电子签名吗?众所周知,电子签名可以使用Photoshop制作。 几天前,那时候还没返校(疫情期间), 需要在一个文件里面提交多个人的 手写签名 ,但他们离我很远。 在没看到詹帅这篇 Python制作电子签名 的文章之前,我是这么做的(只是稍微总结一下PS的做法,重点还是Python的方法)。 我录制了一个动图演示。b63a64d5ffd64cdf0b7edaea44d74bf1.gif

调整对比度和亮度

其实就是在Photoshop中打开图像,把“对比度”和“亮度”都调到最高,然后另存为PNG图片。这样做的弊端就是保存后的图片是白色底的(不是透明的),放在Word中是没有问题的;不过如果背景色不是白色的,那么就很难看了(需要进一步抠图)这篇文章介绍的用Python制作的电子签名,就是透明的(效果见封面图);并且用Python还可以批量自动化。人生苦短,我用Python,毕竟它除了生孩子无所不会!搞定电子签名手到擒来的事情!往下看?

代码

首先需要导入Python程序所依赖的包。Image用来读取图片,numpy用来对图片数组进行计算操作,argparse用来获取命令行传入参数,os用来操作路径。
from PIL import Image
import numpy as np
import argparse
import os
紧接着定义读取图片函数,并将其转化为包含alpha通道的“RGBA”格式图片。
def read_img(img_path):
    image=Image.open(img_path)
    image = image.convert('RGBA')
    size = image.size
    image = np.array(image)
    return size, image
之后便是定义生成电子签名函数,签名是黑区域,像素值接近0。因此将RGB三个通道像素值大于100的设置为透明,并返回签名位置区域坐标点和处理过后的图片。
def get_elesign(size,image):
    '''
    签名是黑色区域,像素值接近0。
    size:输入图片尺寸
    image:numpy array格式的图像
    '''
    points = []
    for j in range(size[0]):
        for i in range(size[1]):
            if image[i][j][0]>100 and image[i][j][1]>100 and image[i][j][2]>100:
                image[i][j][3] = 0
            else:
                image[i][j][0],image[i][j][1],image[i][j][2] = 0,0,0
                points.append((i,j)) 
    return points, image
定义裁剪函数,找到签名区域,返回电子签名。
def clip_image(points, image, save_path, offset=5):
    points = np.array(points).reshape((-1, 2))
    min_value = np.min(points,axis=0)
    x1,y1 = min_value[0]-offset,min_value[1]-offset
    max_value = np.max(points,axis=0)
    x2,y2 = max_value[0]+offset,max_value[1]+offset
    sign_area = image[x1:x2,y1:y2]
    sign_area = Image.fromarray(sign_area)
    sign_area.save(save_path)

最后实例化。

大功告成!

if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="制作电子签名!")
    parser.add_argument("--image_path",type=str, help = "签名图片位置, dir or file")
    parser.add_argument("--offset",type=int, default=5, help = "签名向外扩张范围,默认为5个像素")
    arg = parser.parse_args()
    user_give = arg.image_path
    offset = arg.offset
    if os.path.isdir(user_give):
        imgs_name = os.listdir(user_give)
        for i,name in enumerate(imgs_name):
            if os.path.splitext(name)[-1] in [".jpeg",".JPG",".PNG",".jpg",".png"]:
                basename = os.path.splitext(name)[0]
                img_path = os.path.join(user_give,name)
                save_path = "ele_sign_"+basename+"_%d.png"%i
                size,image = read_img(img_path)
                points, image = get_elesign(size,image)
                clip_image(points, image,  save_path, offset)
    elif os.path.isfile:
        img_path = user_give
        save_path = "ele_sign.png"
        size,image = read_img(img_path)
        points, image = get_elesign(size,image)
        clip_image(points, image, save_path, offset)

执行

为了方便执行,我加了两个终端参数:
--image_path
--offset
前者是用来传入文件路径,这里的路径可以是图片文件,也可以是目录。如果是目录则会遍历目录中的图片文件,进行批量制作电子签名。后者为签名位置修正,默认是5。终端python环境执行命令:
python make_ele_sign.py --image_path 图片或者目录路径

简单粗暴!

效果

最后看看效果!分分钟便拥有了自己帅气的电子签名!(请自动忽略我的笔迹,已经被嘲讽过多次了0952c56bae8bb6cef33f2195fc013e65.png)

8e68c0638a0923bd357f764d0ca7645d.png

这样骚包的Python,你爱不爱?

PS:拍摄的签名需要写在白纸上,且背景尽量不要其他噪声,如果拍摄的图片质量不好,使用该方法得到的电子签名可以手动修剪图片。完整代码已经打包好,在后台回复关键词 电子签名 即可获取
-END-
猜你喜欢
1、Python两行代码剪藏网页为 PDF2、Python快速卡通化人物头像3、有一分热,发一分光

@天作之程

你好起来,身边的一切都会好起来67327e5c2c355d5edbcd78f694cd6d40.png

  在看”  我吗?

f3a02edae3cd6d77daa19ecfee09424a.png

版权声明:本文为weixin_39727934原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。