python3图片裁剪+转换pdf+压缩
本地大量长图,要发送给别人,所以要对图片进行裁剪+转换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+压缩的更多相关文章
- winform利用itextsharp.dll实现图片文件转换PDF格式文件
1.利用itextsharp.dll实现单个图片文件转换为PDF格式文件, 可以使用以下类: void ConvertJPG2PDF(string jpgfile, string pdf) { var ...
- 自己积累的一些Emgu CV代码(主要有图片格式转换,图片裁剪,图片翻转,图片旋转和图片平移等功能)
using System; using System.Drawing; using Emgu.CV; using Emgu.CV.CvEnum; using Emgu.CV.Structure; na ...
- node.js中使用imagemagick进行图片裁剪压缩
node.js中使用imagemagick进行图片裁剪压缩 安装imagemagick sudo apt-get install imagemagick or wget http://www.imag ...
- 适配Android4.4~Android11,调用系统相机,系统相册,系统图片裁剪,转换文件(对图片进行上传等操作)
前言 最近Android对于文件的许多方法进行了修改,网络上又没有对Android4到Android11关于系统相机.系统相册和系统裁剪的适配方案,我花了几天事件总结了一下,先上源码 DEMO源码 先 ...
- vue+uniapp实现照录像,相册选择 | 图片裁剪压缩,视频压缩
一.插件简介 Zhimi-Camera(智密 - 智密 - 相机图册插件-视频/图片选择器)是一个支持拍照,录像,相册选择功能,自带图片裁剪,图片压缩,视频压缩,选择数量限制的uniapp原生插件.平 ...
- uCrop图片裁剪
uCrop使用 github地址 https://github.com/Yalantis/uCrop然后clone或下载到本地,运行之. 效果预览 app/build.gradle compile ' ...
- 使用imgareaselect 辅助后台进行图片裁剪
由于项目其中用到图片裁剪,本来能够不用到后台进行裁剪的,可是要兼容万恶的IE浏览器,所以不得不使用后台进行裁剪. 这次使用到imgareaselect 插件获取须要裁剪区域的坐标.再由后台进行裁剪操作 ...
- 【VC++技术杂谈007】使用GDI+进行图片格式转换
本文主要介绍如何使用GDI+对图片进行格式转换,可以转换的图片格式为bmp.jpg.png. 1.加载GDI+库 GDI+是GDI图形库的一个增强版本,提供了一系列Visual C++ API.为了使 ...
- php图片水印添加,压缩,剪切的封装类
php对图片文件的操作主要是利用GD库扩展.当我们频繁利用php对图片进行操作时,会自然封装很多函数,否则会写太多重复的代码.当有很多对图片的相关函数的时候,我们可以考虑将这些函数也整理一下,因而就有 ...
随机推荐
- Best Cow Fences_二分&&DP
Description Farmer John's farm consists of a long row of N (1 <= N <= 100,000)fields. Each fie ...
- Unity3D ShaderLab法线贴图
Unity3D ShaderLab法线贴图 说到法线贴图,应该算是我们最常使用的一种增强视觉效果的贴图.将法线贴图的各个像素点座位模型的法线,这样我们的光照可以模拟出高分辨率的效果, 同时也保持较低的 ...
- .NET概念:.NET程序编译和运行
.NET概念:.NET程序编译和运行 分类: c#程序设计 2012-02-29 15:46 3001人阅读 评论(2) 收藏 举报 .net编译器语言microsoftassemblyvb.net ...
- JS实现Tab选项卡
http://www.jb51.net/article/24694.htm http://www.sunsean.com/idTabs/#t1 http://www.cnblogs.com/sskse ...
- 重学STM32---(八)----SDIO
1. SDIO(SD/SDIO MMC卡主机模块)在AHB外设总线和多媒体卡(MMC).SD存储卡.SDIO卡和CE-ATA设备间提供了操作接口.(SDIO没有SPI兼容的通信模式 ) 1.1.什么是 ...
- 转:label标签的特殊用法
容易被忽略的label标签 原始作用 label标签是HTML原生的标签,其原始的作用参考这里 label 标签为 input 元素定义标注(标记). label 元素不会向用户呈现任何特殊效果.不过 ...
- 【题解】【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, ...
- Evaluate Reverse Polish Notation
Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid operators are +, -, ...
- js对数组的操作函数
js数组的操作 用 js有很久了,但都没有深究过js的数组形式.偶尔用用也就是简单的string.split(char).这段时间做的一个项目,用到数组的地方很多, 自以为js高手的自己居然无从下手, ...
- linux/lib/string.c
/** * strlen - Find the length of a string * @s: The string to be sized */ size_t strlen(const char ...