利用python对图片按照张数纵向拼接
这段代码可用于制作长图的拼接,例如网上下载的漫画长图,可拼接成很长的一幅图。要求图宽度一致,长度无要求
目录结构
文件夹下是图片文件,不限扩展名
具体代码
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:BTA Huang
import os
import shutil
from PIL import Image
from PIL import ImageFile
ImageFile.LOAD_TRUNCATED_IMAGES = True
filepath='./'
resultpath='./result/'
isExists=os.path.exists(resultpath)
if isExists:
shutil.rmtree(resultpath)#递归删除文件夹
storys=[]
for root, dirs, files in os.walk(filepath):
for dir in dirs:
storys.append(dir)
print(storys) #当前路径下所有子目录文件夹名
os.mkdir(resultpath) #创建一个result文件夹
for story in storys:
print(story)#一个个输出文件夹名,即章节名
path=filepath+story+'/'
imagename=[]#建立一个文件夹下的所有文件名列表
for files in os.listdir(path): # 不仅仅是文件,当前目录下的文件夹也会被认为遍历到
imagename.append(files)
imagename.sort()
print(imagename)
meage_num=12#合并张数
times=len(imagename)/meage_num
if int(times)==times:#判断是否文件数是否会被整除,借以判断合并的批次数
times=int(times)
else:
times=int(times)+1
for time in range(times):#对一个文件夹下的列表进行切片,按照合并规格进行合并
imagename1=imagename[(0+meage_num*time):((meage_num+meage_num*time) if time <(times-1) else None)]
print(imagename1)
high_size =0#高
imageinformation = []
for i in range(len(imagename1)):
img = Image.open(path+imagename1[i])
w, h = img.size[0], img.size[1]
high_size=high_size+h
width_size = w#宽
imageinformation.append(Image.open(path+imagename1[i]))#获取图片详情,加入列表imageinformation
target = Image.new('RGB',(width_size,high_size))#最终拼接的图像的大小
# print(imageinformation)
print(target)
# imageinformation = []#这段是获取图片的详细信息,已在上段代码被替换
# for root,dirs,files in os.walk(path):
# for f in files:
# imageinformation.append(Image.open(path+f))
# print(imageinformation)
left = 0
right = 0#开始合并
for image in imageinformation:
wi, hi = image.size[0], image.size[1]
right += hi#左下角的纵坐标也递增
target.paste(image,(0,left,width_size,right))
left += hi#从上往下拼接,左上角的纵坐标递增
target.save(resultpath+story+imagename1[0][-7:-4]+'-'+imagename1[-1][-7:-4]+'.jpg',quality=100)
代码用的是PIL进行拼接,整体思路是根据合并张数,判断需要合并几次。再根据需要合并的图片文件总长度,在程序内部新建一张长为图片总长度,宽为图片宽度的长图,然后按一张张顺序黏贴到新建长图上。具体的方法说不太清楚,都有备注。