Python 制作代码缩略图展示(2020年12月5日)


制作背景

一天晚上,看着代码编辑工具VScode右上角的缩略图,sublime也有,忽然就想到:可以用python做一个代码文件读取功能,然后批量输出他们的缩略图,顺便看看不同语言缩略图上样子的不同。

效果展示

htmls

java

js

python

css

C语言

html+css

源代码

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
# -*- encoding: utf-8 -*-
"""
代码文件转图片
2020年12月5日
by littlefean
"""
from PIL import Image
import os


def main():
fileTypeArray = ['.html', '.css', '.js', '.java', '.c', '.py']
fr = get_file(os.getcwd(), fileTypeArray)
print(fr)
j = 0
for i in fr:
j += 1
codeToImg(i).save(f"{j}.png")


def get_file(path, fileTypeArr):
"""
根据路径来获得某一个文件夹下所有的 fileTypeArr 类型文件,并将所有 对应文件放到列表中返回
:param fileTypeArr: 一个列表,存放文件后缀名,加点儿
:param path: 文件目录
:return: html 文件的列表,每个文件用路径字符串表示
"""
L = []
for root, dirs, files in os.walk(path):
for file in files:
if os.path.splitext(file)[1] in fileTypeArr:
if os.path.splitext(file)[0] != '__init__':
L.append(os.path.join(root, file))
return L


def codeToImg(codePath):
"""
输入一个代码文件的路径字符串,返回图片
:param codePath: 代码文件路径
:return: 图片
"""
charColor = {
' ': (0, 0, 0),
'/n': (0, 0, 0),
'/r': (0, 0, 0),
'[': (0, 200, 0),
']': (0, 200, 0),
'{': (0, 50, 200),
'}': (0, 50, 200),
'(': (200, 220, 10),
')': (200, 220, 10),
'<': (200, 100, 50),
'>': (200, 100, 50),
'englishChar': (0, 255, 0),
'numberChar': (0, 255, 100),
'normalChar': (10, 255, 10),
}
try:
f = open(codePath, encoding="utf-8")
fArr = f.readlines()
except UnicodeDecodeError:
f = open(codePath)
fArr = f.readlines()
array = []
for i in range(len(fArr)):
array.append([])
for y in range(len(fArr)):
for char in fArr[y]:
if char == '/n':
break
elif char == ' ':
array[y].append(charColor[' '])
elif char == '/t':
for i in range(4):
array[y].append(charColor[' '])
else:
if char.isdigit():
array[y].append(charColor['numberChar'])
elif char.isalpha():
array[y].append(charColor['englishChar'])
else:
if char in charColor:
array[y].append(charColor[char])
else:
array[y].append(charColor['normalChar'])
im = Image.new('RGB', (getMaxLength(array) + 10, len(array) + 1), (0, 0, 0))
for y in range(len(array)):
for x in range(len(array[y])):
im.putpixel((x + 1, y + 1), array[y][x])
print(f"{codePath}, 已经图片化")
return im


def showImg(array):
im = Image.new('RGB', (getMaxLength(array) + 10, len(array)+1), (0, 0, 0))
for y in range(len(array)):
for x in range(len(array[y])):
if array[y][x] == 0:
im.putpixel((x+1, y+1), (25, 100, 25))
elif array[y][x] == 1:
im.putpixel((x+1, y+1), (0, 255, 0))
im.show()


def getMaxLength(array):
"""获取一个列表中子元素数量最多的那个子元素的子元素数量"""
numArr = []
maxNum = 1
for item in array:
numArr.append(len(item))
if len(numArr) != 0:
maxNum = max(numArr)
return maxNum


if __name__ == '__main__':
main()

使用方法

让该脚本放到一新建文件夹里,然后让所有的代码文件全部放到该文件夹下,不用一个一个摘出来,直接把整个项目文件夹放到该新建的文件夹内部即可。运行程序会在该文件夹下输出。

修改main函数里的 fileTypeArray 里的内容,可以对更多不同种类的代码进行缩略图转化。

发现与总结

我把所有学过的代码风格全部列举以下:

c语言的风格是这样的

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
xxxxxx
{
xxxxxx
{
xxxx
{
xxxx
}
xxxx
{
xxxx
}
}
xxxxxx
{
xxxx
{
xxxx
}
xxxx
{
xxxx
}
}
}

java和js的风格是

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
xxxxxx xx{
xxxxxxx xxx{
xxxx xxxxx xxxx{
xxxxxxxxxx xxxxxxxxx{
xxxxxxxx{
xxxxxx
}
xxxxxxxx{
xxxxxx
}
}
xxxxxxxxxx xxxxxxxxx{
xxxxxxxx{
xxxxxx
}
xxxxxxxx{
xxxxxx
}
}
}
}
}

python的风格是

1
2
3
4
5
6
7
8
9
10
11
12
13
14
xxx xxx:
xxxxxxxxxxx:
xxxxxxxxxx:
xxxxxxxxxxx:
xxxxxxxxxxx
xxxxxxxxxxx:
xxxxxxxxxxx
xxxxxxxxxx:
xxxxxxxxxxx:
xxxxxxxxxxx
xxxxxxxxxxx:
xxxxxxxxxxx


css的风格是

1
2
3
4
5
6
7
8
9
10
11
12
13
xxxxx {
xxxxxxxxxx
xxxxxxx
xxxxxxxxxx
xxxx
}

xxx xx {
xxxxxxxxxx
xxxxxxx
xxxxxxxxxx
xxxx
}

html风格是

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<xxx>
<xxx>
<xxx>
<xxx> xxxxxxxx </xxxx>
</xxxx>
<xxx>
<xxx> xxxxxxxx </xxxx>
</xxxx>
</xxxx>
<xxx>
<xxx>
<xxx> xxxxxxxx </xxxx>
</xxxx>
<xxx>
<xxx> xxxxxxxx </xxxx>
</xxxx>
</xxxx>
</xxxx>

我个人最喜欢python的紧凑和缩进风格。

其次是java的风格,喜欢java这样比C语言紧凑,但是它的大括号和这种写法导致了最下面要有一长长的括号链条,看着感觉很占空间的样子。

最不习惯的是C语言的风格,因为它实在是太零散了,但是这样设计的原因是能够结构化阅读和对齐,一块一块的更有逻辑性。

当然这些都只是个人看法。每一种语言都有它本身的习惯。我们应该尽量遵守不同语言的默认习惯。

程序待改进:生成的图片都太小了,每个像素点表示一个字符,只有放大看才能看清楚,因此需要增加可以设置缩放倍率的功能。