本地大量长图,要发送给别人,所以要对图片进行裁剪+转换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. 我与python3擦肩而过(三)—— 我去。。又是编码问题——urllib.parse.unquote

    记得初学python时就学的爬虫,经常遇到编码问题(其实在python3里面编码问题已经很少了...),用requests库就挺方便解决这些问题的.近来有共同学习python的程序员写了个电子书网站, ...

  2. ERP反馈信息管理(十九)

    前台显示的界面: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Custo ...

  3. HDU 5823 (状压dp)

    Problem color II 题目大意 定义一个无向图的价值为给每个节点染色使得每条边连接的两个节点颜色不同的最少颜色数. 对于给定的一张由n个点组成的无向图,求该图的2^n-1张非空子图的价值. ...

  4. Unity3D ShaderLab 模拟纹理运动

    Unity3D ShaderLab 模拟纹理运动 这一篇,我们要说到着色器上的uv贴图的滚动效果,这样的场景可以用在河流,瀑布,熔岩等效果.算是创建纹理动画的基础技术之一. 所以 准备一个新的着色器文 ...

  5. cocos2dx 搭建 android 平台 -2

    1.配置Cocos2d-x for Xcode. 这一块比较简单, 可以参见其他文章. 重点:install-templates-xcode.sh 2.配置普通Android开发环境 这一块包括JDK ...

  6. [数据结构]KMP小结

    KMP小结   By Wine93 2013.9 1.学习链接: http://www.matrix67.com/blog/archives/115 2.个人小结 1.KMP在字符串中匹配中起着巨大作 ...

  7. Disable Portrait in app

    I had this problem as well as I wanted to constrain my game to only landscape mode. I put this in my ...

  8. magento设置订单状态

    <?php require_once('app/Mage.php');umask(0);Mage::app('default'); $order = Mage::getModel('sales/ ...

  9. Pike的安装(Ubuntu环境)

    本机环境: Ubuntu 14.04 安装:sudo apt-get install pike7.8-dev 或者: sudo apt-get install pike7.8 官网下载源码 获取git ...

  10. Open vSwitch 给虚拟机网卡限流(QoS)

    这里我们简单描述下如何通过Open vSwitch给虚拟机限流(出流量),同时测试限流效果.测试环境继续复用<整合Open vSwitch与DNSmasq为虚拟机提供DHCP功能>一文中描 ...