前言在我们工作和生活中 , 你使用过电子签名吗?
众所周知 , 电子签名可以使用Photoshop制作 , 但是Photoshop安装过程复杂 , 占内存 , 杀鸡焉用牛刀?而且网上提供的在线转换也要注意安全性!
人生苦短 , 我用Python , 毕竟它除了生孩子无所不会!搞定电子签名手到擒来的事情!往下看
代码首先需要导入Python程序所依赖的包 , Image用来读取图片 , numpy用来对图片数组进行计算操作 , argparse用来获取命令行传入参数 , os用来操作路径 。
from PIL import Imageimport numpy as npimport argparseimport 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)
推荐阅读
- Python自动化有哪些有趣的事情?
- Python求解特征向量和拉普拉斯矩阵
- 用Python连接4个常用数据库的URL写法,你掌握了吗?
- 现在淘宝开店怎么操作 开个淘宝网店的步骤
- 高德地图手机与车载同步操作分享
- 淘宝直通车测款测图详细步骤 淘宝直通车测图操作步骤
- 茶树试验的操作技术,茶园套种技术该如何操作
- 淘宝测图测款什么软件 淘宝测图通过怎么操作
- ps,kill,keep Linux操作系统中进程的操作命令
- 用Python实现十大经典排序算法-插入、选择、快速、冒泡、归并等
