本地大量长图,要发送给别人,所以要对图片进行裁剪+转换pdf+压缩

 import zipfile
import os
from concurrent.futures import ThreadPoolExecutor
from reportlab.lib.pagesizes import A4, landscape
from reportlab.pdfgen import canvas
from PIL import Image
import time # 设置全局变量
filepath = "../jpg/cartoon/"
outzipfilepath = "../jpg/cartoonzip/"
outpdffilepath = "../jpg/cartoonpdf/"
cropimgpath = "../jpg/image/" # 找出文件夹下所有.xml后缀的文件
def listfiles(rootdir, prefix='.xml'):
file = []
for parent, dirnames, filenames in os.walk(rootdir):
if parent == rootdir:
for filename in filenames:
if filename.endswith(prefix):
file.append(filename)
return file
else:
pass # 创建文件夹
def createjia(path):
try:
os.makedirs(path)
except:
pass # 这里是裁剪图片
# 传入的是图片的名字
def cropimg_tranpdf(imgname):
# 新生成的文件夹的名字
tempfilename = str(imgname.replace(".png", "")) # 创建保存裁剪后的图片的文件夹
createpath = "../jpg/image/" + str(tempfilename)
createjia(createpath) # 打开图片
imgpath = filepath + imgname
img = Image.open(imgpath) # 获得图片的宽高
width = int(img.size[0])
height = int(img.size[1]) # A4的宽1240,高1754
# 制作裁剪坐标
countheight = (height // 1240) # 设置初始高度为1240
newheight = 1240 # 将要保存的pdf的位置和名字
pdfname = str(outpdffilepath) + str(tempfilename) + ".pdf"
# A4的大小
# 发现A4会把长图压缩成1张A4的大小
(w, h) = landscape(A4)
# 保存pdf
c = canvas.Canvas(str(pdfname), pagesize=landscape(A4))
# number of page
for i in range(0, countheight):
newheight = newheight + 1240
# 裁剪的位置
# (起始宽的位置,起始高的位置,裁剪宽度,裁剪高度)
# 左上角的坐标为(0,0)
region = (0, newheight - 1240, width, newheight)
# 裁剪
cropImg = img.crop(region)
# 保存
jpgname = str(i) + ".jpg"
# 保存裁剪后的图片
cropImg.save(str(createpath) + "/" + str(jpgname)) # 写入的jpg将其组合成pdf
filepath_jpgname = str(createpath) + "/" + str(jpgname)
c.drawImage(filepath_jpgname, 0, 0, w, h)
c.showPage()
c.save()
print("完成PDF:" + str(tempfilename)) # 这里是裁剪和转化pdf的多进程
# 开启多进程
def threadingcrop_pdf(number):
# 进程数
pool = ThreadPoolExecutor(int(number))
# 读取文件夹名字
namelist = listfiles(filepath, "png") # 进程开跑
for name in namelist:
print(name)
pool.submit(cropimg_tranpdf, name)
# 太快电脑受不了
time.sleep(1) # 这里传入的是pdf的名字
# 写入压缩文件
def zipfiles(names):
# 需要压缩到的文件目录和名字
zipname = str(outzipfilepath) + str(names.replace(".pdf", "")) + ".zip"
# 需要压缩的文件位置和名字
name = outpdffilepath + names
files = zipfile.ZipFile(zipname, 'w', zipfile.ZIP_DEFLATED) # 写入压缩包
files.write(name)
files.close()
print("完成压缩:" + str(zipname)) # 这里是压缩zip的多进程
# 开启多进程
def threadingzip(number):
# 先转化为pdf
threadingcrop_pdf(number)
# 进程数
pool = ThreadPoolExecutor(int(number))
# 读取文件名字
namelist = listfiles(outpdffilepath, "pdf")
# 进程开跑
for name in namelist:
print(name)
pool.submit(zipfiles, name)
# 太快电脑受不了
time.sleep(1) if __name__ == '__main__':
# 多进程
#number = 1
#threadingzip(number) # 写入pdf
namelistpdf = listfiles(filepath, "png")
for name in namelistpdf:
print(name)
cropimg_tranpdf(name) # 写入zip
namelistzip = listfiles(outpdffilepath, "pdf")
for name in namelistzip:
print(name)
zipfiles(name)

python3图片裁剪+转换pdf+压缩的更多相关文章

  1. winform利用itextsharp.dll实现图片文件转换PDF格式文件

    1.利用itextsharp.dll实现单个图片文件转换为PDF格式文件, 可以使用以下类: void ConvertJPG2PDF(string jpgfile, string pdf) { var ...

  2. 自己积累的一些Emgu CV代码(主要有图片格式转换,图片裁剪,图片翻转,图片旋转和图片平移等功能)

    using System; using System.Drawing; using Emgu.CV; using Emgu.CV.CvEnum; using Emgu.CV.Structure; na ...

  3. node.js中使用imagemagick进行图片裁剪压缩

    node.js中使用imagemagick进行图片裁剪压缩 安装imagemagick sudo apt-get install imagemagick or wget http://www.imag ...

  4. 适配Android4.4~Android11,调用系统相机,系统相册,系统图片裁剪,转换文件(对图片进行上传等操作)

    前言 最近Android对于文件的许多方法进行了修改,网络上又没有对Android4到Android11关于系统相机.系统相册和系统裁剪的适配方案,我花了几天事件总结了一下,先上源码 DEMO源码 先 ...

  5. vue+uniapp实现照录像,相册选择 | 图片裁剪压缩,视频压缩

    一.插件简介 Zhimi-Camera(智密 - 智密 - 相机图册插件-视频/图片选择器)是一个支持拍照,录像,相册选择功能,自带图片裁剪,图片压缩,视频压缩,选择数量限制的uniapp原生插件.平 ...

  6. uCrop图片裁剪

    uCrop使用 github地址 https://github.com/Yalantis/uCrop然后clone或下载到本地,运行之. 效果预览 app/build.gradle compile ' ...

  7. 使用imgareaselect 辅助后台进行图片裁剪

    由于项目其中用到图片裁剪,本来能够不用到后台进行裁剪的,可是要兼容万恶的IE浏览器,所以不得不使用后台进行裁剪. 这次使用到imgareaselect 插件获取须要裁剪区域的坐标.再由后台进行裁剪操作 ...

  8. 【VC++技术杂谈007】使用GDI+进行图片格式转换

    本文主要介绍如何使用GDI+对图片进行格式转换,可以转换的图片格式为bmp.jpg.png. 1.加载GDI+库 GDI+是GDI图形库的一个增强版本,提供了一系列Visual C++ API.为了使 ...

  9. php图片水印添加,压缩,剪切的封装类

    php对图片文件的操作主要是利用GD库扩展.当我们频繁利用php对图片进行操作时,会自然封装很多函数,否则会写太多重复的代码.当有很多对图片的相关函数的时候,我们可以考虑将这些函数也整理一下,因而就有 ...

随机推荐

  1. Best Cow Fences_二分&&DP

    Description Farmer John's farm consists of a long row of N (1 <= N <= 100,000)fields. Each fie ...

  2. Unity3D ShaderLab法线贴图

    Unity3D ShaderLab法线贴图 说到法线贴图,应该算是我们最常使用的一种增强视觉效果的贴图.将法线贴图的各个像素点座位模型的法线,这样我们的光照可以模拟出高分辨率的效果, 同时也保持较低的 ...

  3. .NET概念:.NET程序编译和运行

    .NET概念:.NET程序编译和运行 分类: c#程序设计 2012-02-29 15:46 3001人阅读 评论(2) 收藏 举报 .net编译器语言microsoftassemblyvb.net ...

  4. JS实现Tab选项卡

    http://www.jb51.net/article/24694.htm http://www.sunsean.com/idTabs/#t1 http://www.cnblogs.com/sskse ...

  5. 重学STM32---(八)----SDIO

    1. SDIO(SD/SDIO MMC卡主机模块)在AHB外设总线和多媒体卡(MMC).SD存储卡.SDIO卡和CE-ATA设备间提供了操作接口.(SDIO没有SPI兼容的通信模式 ) 1.1.什么是 ...

  6. 转:label标签的特殊用法

    容易被忽略的label标签 原始作用 label标签是HTML原生的标签,其原始的作用参考这里 label 标签为 input 元素定义标注(标记). label 元素不会向用户呈现任何特殊效果.不过 ...

  7. 【题解】【BT】【Leetcode】Binary Tree Level Order Traversal

    Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, ...

  8. Evaluate Reverse Polish Notation

    Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid operators are +, -, ...

  9. js对数组的操作函数

    js数组的操作 用 js有很久了,但都没有深究过js的数组形式.偶尔用用也就是简单的string.split(char).这段时间做的一个项目,用到数组的地方很多, 自以为js高手的自己居然无从下手, ...

  10. linux/lib/string.c

    /** * strlen - Find the length of a string * @s: The string to be sized */ size_t strlen(const char ...