这次的内容是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 = 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) 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,而且最终结果是全部都搞好了,没有遗漏章节,所以我对于这个报错就感到了一脸迷惑,不过说不定是我的目录有问题。
那么这次博客就到这里了,每天进步一点点~~