本地大量长图,要发送给别人,所以要对图片进行裁剪+转换pdf+压缩
1 import zipfile 2 import os 3 from concurrent.futures import ThreadPoolExecutor 4 from reportlab.lib.pagesizes import A4, landscape 5 from reportlab.pdfgen import canvas 6 from PIL import Image 7 import time 8 9 # 设置全局变量 10 filepath = "../jpg/cartoon/" 11 outzipfilepath = "../jpg/cartoonzip/" 12 outpdffilepath = "../jpg/cartoonpdf/" 13 cropimgpath = "../jpg/image/" 14 15 16 # 找出文件夹下所有.xml后缀的文件 17 def listfiles(rootdir, prefix='.xml'): 18 file = [] 19 for parent, dirnames, filenames in os.walk(rootdir): 20 if parent == rootdir: 21 for filename in filenames: 22 if filename.endswith(prefix): 23 file.append(filename) 24 return file 25 else: 26 pass 27 28 29 # 创建文件夹 30 def createjia(path): 31 try: 32 os.makedirs(path) 33 except: 34 pass 35 36 37 # 这里是裁剪图片 38 # 传入的是图片的名字 39 def cropimg_tranpdf(imgname): 40 # 新生成的文件夹的名字 41 tempfilename = str(imgname.replace(".png", "")) 42 43 # 创建保存裁剪后的图片的文件夹 44 createpath = "../jpg/image/" + str(tempfilename) 45 createjia(createpath) 46 47 # 打开图片 48 imgpath = filepath + imgname 49 img = Image.open(imgpath) 50 51 # 获得图片的宽高 52 width = int(img.size[0]) 53 height = int(img.size[1]) 54 55 # A4的宽1240,高1754 56 # 制作裁剪坐标 57 countheight = (height // 1240) 58 59 # 设置初始高度为1240 60 newheight = 1240 61 62 # 将要保存的pdf的位置和名字 63 pdfname = str(outpdffilepath) + str(tempfilename) + ".pdf" 64 # A4的大小 65 # 发现A4会把长图压缩成1张A4的大小 66 (w, h) = landscape(A4) 67 # 保存pdf 68 c = canvas.Canvas(str(pdfname), pagesize=landscape(A4)) 69 # number of page 70 for i in range(0, countheight): 71 newheight = newheight + 1240 72 # 裁剪的位置 73 # (起始宽的位置,起始高的位置,裁剪宽度,裁剪高度) 74 # 左上角的坐标为(0,0) 75 region = (0, newheight - 1240, width, newheight) 76 # 裁剪 77 cropImg = img.crop(region) 78 # 保存 79 jpgname = str(i) + ".jpg" 80 # 保存裁剪后的图片 81 cropImg.save(str(createpath) + "/" + str(jpgname)) 82 83 # 写入的jpg将其组合成pdf 84 filepath_jpgname = str(createpath) + "/" + str(jpgname) 85 c.drawImage(filepath_jpgname, 0, 0, w, h) 86 c.showPage() 87 c.save() 88 print("完成PDF:" + str(tempfilename)) 89 90 91 # 这里是裁剪和转化pdf的多进程 92 # 开启多进程 93 def threadingcrop_pdf(number): 94 # 进程数 95 pool = ThreadPoolExecutor(int(number)) 96 # 读取文件夹名字 97 namelist = listfiles(filepath, "png") 98 99 # 进程开跑 100 for name in namelist: 101 print(name) 102 pool.submit(cropimg_tranpdf, name) 103 # 太快电脑受不了 104 time.sleep(1) 105 106 107 108 # 这里传入的是pdf的名字 109 # 写入压缩文件 110 def zipfiles(names): 111 # 需要压缩到的文件目录和名字 112 zipname = str(outzipfilepath) + str(names.replace(".pdf", "")) + ".zip" 113 # 需要压缩的文件位置和名字 114 name = outpdffilepath + names 115 files = zipfile.ZipFile(zipname, 'w', zipfile.ZIP_DEFLATED) 116 117 # 写入压缩包 118 files.write(name) 119 files.close() 120 print("完成压缩:" + str(zipname)) 121 122 123 # 这里是压缩zip的多进程 124 # 开启多进程 125 def threadingzip(number): 126 # 先转化为pdf 127 threadingcrop_pdf(number) 128 # 进程数 129 pool = ThreadPoolExecutor(int(number)) 130 # 读取文件名字 131 namelist = listfiles(outpdffilepath, "pdf") 132 # 进程开跑 133 for name in namelist: 134 print(name) 135 pool.submit(zipfiles, name) 136 # 太快电脑受不了 137 time.sleep(1) 138 139 140 if __name__ == '__main__': 141 # 多进程 142 #number = 1 143 #threadingzip(number) 144 145 # 写入pdf 146 namelistpdf = listfiles(filepath, "png") 147 for name in namelistpdf: 148 print(name) 149 cropimg_tranpdf(name) 150 151 # 写入zip 152 namelistzip = listfiles(outpdffilepath, "pdf") 153 for name in namelistzip: 154 print(name) 155 zipfiles(name)