-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgenPic.py
76 lines (61 loc) · 2.38 KB
/
genPic.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
from sys import argv
from PIL import Image,ImageFont,ImageDraw
from time import localtime, strftime
from genFont import fontName, fontFileName, fontSize, glyphWidth, glyphHeight, charset, fontPicPath, fontFilePath
bias=128
glyphMap={}
for ch in charset:
ordOfCh=ord(ch)
fontPicName=f'{fontName}_{hex(ordOfCh)[2:]:2s}.png'
fontPic=Image.open(fontPicPath+fontPicName)
fontPic=fontPic.convert("L")
fontPicData=fontPic.getdata()
biasedFontPicData=list(map(lambda x: x-bias,fontPicData))
glyphMap[ch]=biasedFontPicData
if len(argv)<2:
print("Usage: python genPic.py filename [width]")
exit(0)
imageName=argv[1]
image=Image.open(imageName)
image=image.convert("L")
width,height=0,0
if len(argv)>=3:
width=int(argv[2])
height=int(image.size[1]*width/image.size[0])
else:
width,height=image.size
width=round(number=width/glyphWidth)*glyphWidth
height=round(height/glyphHeight)*glyphHeight
image=image.resize((width,height))
imageData=image.getdata()
imageMatrix=[[255-bias for i in range(width)] for j in range(height)]
for i in range(len(imageData)):
imageMatrix[i//width][i%width]=255-imageData[i]-bias
charCountWidth=width//glyphWidth
charCountHeight=height//glyphHeight
charMatrix=[[0 for i in range(charCountWidth)] for j in range(charCountHeight)]
for i in range(charCountHeight):
if i%5==0:
print(f"Processing line {i:3d}/{charCountHeight-1:3d}...")
for j in range(charCountWidth):
maxScore=-1e10
maxChar=None
for ch in glyphMap:
score=0.0
for k in range(glyphHeight):
for l in range(glyphWidth):
score+=(glyphMap[ch][k*glyphWidth+l])/128.0*(imageMatrix[i*glyphHeight+k][j*glyphWidth+l])/128.0
if score>maxScore:
maxScore=score
maxChar=ch
charMatrix[i][j]=maxChar
outputFilename=f"{strftime('%Y%m%d_%H%M%S', localtime())}_{width}x{height}.png"
outputPath="output/"
outputImage=Image.new("L",(width,height))
draw=ImageDraw.Draw(outputImage)
font=ImageFont.truetype(fontFileName,fontSize)
for i in range(len(charMatrix)):
for j in range(len(charMatrix[i])):
draw.text((j*glyphWidth,i*glyphHeight),charMatrix[i][j],font=font,fill=255)
outputImage.save(f"{outputPath}{outputFilename}")
print(f"Output file: {outputPath}{outputFilename}")