在我们工作和生活中,你使用过电子签名吗?
众所周知,电子签名可以使用Photoshop制作,但是Photoshop安装过程复杂,占内存,杀鸡焉用牛刀?而且网上提供的在线转换也要注意安全性!
人生苦短,我用Python,毕竟它除了生孩子无所不会!搞定电子签名手到擒来的事情!往下看
代码首先需要导入Python程序所依赖的包,Image用来读取图片,numpy用来对图片数组进行计算操作,argparse用来获取命令行传入参数,os用来操作路径。
fromPILimportImage
importnumpyasnp
importargparse
importos
紧接着定义读取图片函数,并将其转化为包含alpha通道的“RGBA”格式图片。
defread_img(img_path):
image=Image.open(img_path)
image=image.convert('RGBA')
size=image.size
image=np.array(image)
returnsize,image
之后便是定义生成电子签名函数,签名是黑区域,像素值接近0。因此将RGB三个通道像素值大于100的设置为透明,并返回签名位置区域坐标点和处理过后的图片。
defget_elesign(size,image):
'''
签名是黑色区域,像素值接近0。
size:输入图片尺寸
image:numpy array格式的图像
'''
points=[]
forjinrange(size[0]):
foriinrange(size[1]):
ifimage[i][j][0]>100andimage[i][j][1]>100andimage[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))
returnpoints,image
定义裁剪函数,找到签名区域,返回电子签名。
defclip_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="签名图片位置,dirorfile")
parser.add_argument("--offset",type=int,default=5,help="签名向外扩张范围,默认为5个像素")
arg=parser.parse_args()
user_give=arg.image_path
offset=arg.offset
ifos.path.isdir(user_give):
imgs_name=os.listdir(user_give)
fori,nameinenumerate(imgs_name):
ifos.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)
elifos.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 图片或者目录路径
简单粗暴!
效果最后看看效果!分分钟便拥有了自己帅气的电子签名!这样骚包的Python,你爱不爱?
PS:拍摄的签名需要写在白纸上,且背景尽量不要其他噪声,如果拍摄的图片质量不好,使用该方法得到的电子签名可以手动修剪图片。
,