forked from airob0t/idcardgenerator
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathidcardgenerator.py
157 lines (138 loc) · 6.16 KB
/
idcardgenerator.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
# coding:utf-8
import os
import PIL.Image as PImage
from PIL import ImageFont, ImageDraw
import cv2
import numpy as np
try:
from Tkinter import *
from ttk import *
from tkFileDialog import *
from tkMessageBox import *
except ImportError:
from tkinter import *
from tkinter.ttk import *
from tkinter.filedialog import *
from tkinter.messagebox import *
if getattr(sys, 'frozen', None):
base_dir = os.path.join(sys._MEIPASS, 'usedres')
else:
base_dir = os.path.join(os.path.dirname(__file__), 'usedres')
def changeBackground(img, img_back, zoom_size, center):
# 缩放
img = cv2.resize(img, zoom_size)
rows, cols, channels = img.shape
# 转换hsv
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# 获取mask
lower_blue = np.array([78, 43, 46])
upper_blue = np.array([110, 255, 255])
mask = cv2.inRange(hsv, lower_blue, upper_blue)
# cv2.imshow('Mask', mask)
# 腐蚀膨胀
erode = cv2.erode(mask, None, iterations=1)
dilate = cv2.dilate(erode, None, iterations=1)
# 粘贴
for i in range(rows):
for j in range(cols):
if dilate[i, j] == 0: # 0代表黑色的点
img_back[center[0] + i, center[1] + j] = img[i, j] # 此处替换颜色,为BGR通道
return img_back
def paste(avatar, bg, zoom_size, center):
avatar = cv2.resize(avatar, zoom_size)
rows, cols, channels = avatar.shape
for i in range(rows):
for j in range(cols):
bg[center[0] + i, center[1] + j] = avatar[i, j]
return bg
def generator():
global ename, esex, enation, eyear, emon, eday, eaddr, eidn, eorg, elife, ebgvar
name = ename.get()
sex = esex.get()
nation = enation.get()
year = eyear.get()
mon = emon.get()
day = eday.get()
org = eorg.get()
life = elife.get()
addr = eaddr.get()
idn = eidn.get()
fname = askopenfilename(parent=root, initialdir=os.getcwd(), title=u'选择头像')
# print fname
im = PImage.open(os.path.join(base_dir, 'empty.png'))
avatar = PImage.open(fname) # 500x670
name_font = ImageFont.truetype(os.path.join(base_dir, 'hei.ttf'), 72)
other_font = ImageFont.truetype(os.path.join(base_dir, 'hei.ttf'), 60)
bdate_font = ImageFont.truetype(os.path.join(base_dir, 'fzhei.ttf'), 60)
id_font = ImageFont.truetype(os.path.join(base_dir, 'ocrb10bt.ttf'), 72)
draw = ImageDraw.Draw(im)
draw.text((630, 690), name, fill=(0, 0, 0), font=name_font)
draw.text((630, 840), sex, fill=(0, 0, 0), font=other_font)
draw.text((1030, 840), nation, fill=(0, 0, 0), font=other_font)
draw.text((630, 980), year, fill=(0, 0, 0), font=bdate_font)
draw.text((950, 980), mon, fill=(0, 0, 0), font=bdate_font)
draw.text((1150, 980), day, fill=(0, 0, 0), font=bdate_font)
start = 0
loc = 1120
while start + 11 < len(addr):
draw.text((630, loc), addr[start:start + 11], fill=(0, 0, 0), font=other_font)
start += 11
loc += 100
draw.text((630, loc), addr[start:], fill=(0, 0, 0), font=other_font)
draw.text((950, 1475), idn, fill=(0, 0, 0), font=id_font)
draw.text((1050, 2750), org, fill=(0, 0, 0), font=other_font)
draw.text((1050, 2895), life, fill=(0, 0, 0), font=other_font)
avatar = cv2.cvtColor(np.asarray(avatar), cv2.COLOR_RGB2BGR)
im = cv2.cvtColor(np.asarray(im), cv2.COLOR_RGB2BGR)
if ebgvar.get():
im = changeBackground(avatar, im, (500, 670), (690, 1500))
else:
#im.paste(avatar, (1500, 690), mask=avatar)
im = paste(avatar, im, (500, 670), (690, 1500))
im = PImage.fromarray(cv2.cvtColor(im, cv2.COLOR_BGR2RGB))
im.save('color.png')
im.convert('L').save('bw.png')
showinfo(u'成功', u'文件已生成到目录下,黑白bw.png和彩色color.png')
if __name__ == '__main__':
global ename, esex, enation, eyear, emon, eday, eaddr, eidn, eorg, elife, ebgvar
root = Tk()
root.title(u'AIRobot身份证图片生成器')
# root.geometry('640x480')
root.resizable(width=False, height=False)
Label(root, text=u'姓名:').grid(row=0, column=0, sticky=W, padx=3, pady=3)
ename = Entry(root, width=8)
ename.grid(row=0, column=1, sticky=W, padx=3, pady=3)
Label(root, text=u'性别:').grid(row=0, column=2, sticky=W, padx=3, pady=3)
esex = Entry(root, width=8)
esex.grid(row=0, column=3, sticky=W, padx=3, pady=3)
Label(root, text=u'民族:').grid(row=0, column=4, sticky=W, padx=3, pady=3)
enation = Entry(root, width=8)
enation.grid(row=0, column=5, sticky=W, padx=3, pady=3)
Label(root, text=u'出生年:').grid(row=1, column=0, sticky=W, padx=3, pady=3)
eyear = Entry(root, width=8)
eyear.grid(row=1, column=1, sticky=W, padx=3, pady=3)
Label(root, text=u'月:').grid(row=1, column=2, sticky=W, padx=3, pady=3)
emon = Entry(root, width=8)
emon.grid(row=1, column=3, sticky=W, padx=3, pady=3)
Label(root, text=u'日:').grid(row=1, column=4, sticky=W, padx=3, pady=3)
eday = Entry(root, width=8)
eday.grid(row=1, column=5, sticky=W, padx=3, pady=3)
Label(root, text=u'住址:').grid(row=2, column=0, sticky=W, padx=3, pady=3)
eaddr = Entry(root, width=32)
eaddr.grid(row=2, column=1, sticky=W, padx=3, pady=3, columnspan=5)
Label(root, text=u'证件号码:').grid(row=3, column=0, sticky=W, padx=3, pady=3)
eidn = Entry(root, width=32)
eidn.grid(row=3, column=1, sticky=W, padx=3, pady=3, columnspan=5)
Label(root, text=u'签发机关:').grid(row=4, column=0, sticky=W, padx=3, pady=3)
eorg = Entry(root, width=32)
eorg.grid(row=4, column=1, sticky=W, padx=3, pady=3, columnspan=5)
Label(root, text=u'有效期限:').grid(row=5, column=0, sticky=W, padx=3, pady=3)
elife = Entry(root, width=32)
elife.grid(row=5, column=1, sticky=W, padx=3, pady=3, columnspan=5)
Label(root, text=u'选项:').grid(row=6, column=0, sticky=W, padx=3, pady=3)
ebgvar = IntVar()
ebg = Checkbutton(root, text=u'自动抠图', variable=ebgvar)
ebg.grid(row=6, column=1, sticky=W, padx=3, pady=3, columnspan=5)
Button(root, text=u'生成', width=32, command=generator).grid(row=7, column=1, sticky=W, padx=3, pady=3, columnspan=4)
# root.iconbitmap(os.path.join(base_dir, 'ico.ico'))
root.mainloop()