Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

Gray-Ice

个人博客兼个人网站

这次的内容是PIL长图片合成,效果如下:

我爬一个图片网站的时候发现怕取下来的都是小图片,还需要合成,于是在经过一番百度后成功做出可将小图片合成长图片的代码。

不过在讲解代码前先让我讲一下我的目录结构:

./download/

​ 章节1文件夹,

​ 图片1,图片2…..

​ 章节2文件夹

​ 图片1, 图片2…..

​ 章节….

就是这么个结构,如果理解不了这里还有文字描述版的:

在download目录下有许多个文件夹,每个文件夹里都是一个章节的图片,这些文件夹已经命名完毕,命名为: 章节1,章节2, 章节3 ……在每个章节文件夹下都有该章节的小图片,图片已经命名完毕,命名为: 1.jpg, 2.jpg, 3.jpg ….每个文件夹下的图片数量都不一定相同。

那么下面就是代码了:

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
from PIL import Image
from os import listdir
import re

# 给图片按章节排序
new = sorted(listdir('./download'), key=lambda i: int(re.search('(\d+)', i).group()))
print(new)

# 设置一个count用来给合成的长图命名
count = 1

for dir1 in new:
height_list = []
width_list = []
# 获取每个文件夹里的图片名
lop = listdir('./download/%s' % dir1)
dir_length = len(lop)
# 以下代码用来获取该章节下所有图片宽度和图片长度
for i in lop:
im = Image.open('./download/%s/' % dir1 + i)
height_list.append(im.size[1])
width_list.append(im.size[0])

# 获取最长的图片尺寸和最宽的图片尺寸,以防画布过小导致无法展示全部图片
max_height = max(height_list)
max_width = max(width_list)

# 生成一张新图片
new_pic = Image.new('RGB', (max_width, max_height * dir_length))

# 拼接目录下所有图片
for row in range(1, dir_length + 1):
im = Image.open('./download/%s/' % dir1 + str(row) + '.jpg')
# 这段是我抄的代码,是用来改图片尺寸的,我认为不需要改的话去掉没问题,但是我没去掉过,你可以试试
from_image = im.resize(
(width_list[row - 1], height_list[row - 1]), Image.ANTIALIAS)
# 说明一下这里的元组: 第一个参数是x轴的位置,这段代码即粘贴到x轴的0上,第二个是y轴,道理同x
new_pic.paste(from_image, (0, (row - 1) * height_list[row - 1]))
count += 1
# 如果报错了就告诉我哪个章节错了,因为我已经分好了章节,所以可以直接用这种方式,同时防止程序停止运行
try:
new_pic.save('./pages/%s.jpg' % count)
except Exception:
print(count)

最后一点的这个try,我觉得是没有必要的,但是有两个章节报错了,理由我也不知道为什么,不过报错之后你不理他,他会生成一张好的图片,一张坏的图片。。。所以我就加上try了,没有必要改进嘛。同时说明一下,坏的图片就是输出的那个count,好的图片名为count + 1,而且最终结果是全部都搞好了,没有遗漏章节,所以我对于这个报错就感到了一脸迷惑,不过说不定是我的目录有问题。

那么这次博客就到这里了,每天进步一点点~~

评论



愿火焰指引你