对于一些零散的图片,想要把它们给拼接起来,有时候呢,再把它转化为PDF格式可能会更方便一点,那么接下来讲的可能就会派上用场。

没错,如标题所说,就一个库,PIL,就能实现这些功能【完整代码在文章最后】

当然整个过程还得依靠一下其他库来获取下文件,或者实现一些其它小操作


  • 接下来要做的就是利用 os 库获取到这些图片文件的路径,并存入列表等待使用

    • 首先得获得文件夹的路径 path (当然是自己输入啦)
    • 然后再获取到文件夹的文件路径
path = r'c:\users\...\...'
imgs = [op.join(path, name) for name in os.listdir(path)]
不难发现,这获取到的不仅是文件夹下的图片路径,而是该文件下所有的文件路径, 没关系,后面可以通过试错来给它筛喽(当然也可以多写几行代码筛选一下,保留住图片的文件路径[依据后缀],甚至筛选出一些特定的图片文件)
hight = 20 + 5*len(img_list)
  • 然后,遍历的时候,如果需要考虑图拍尺寸不一的情况,就得获取文件尺寸的列表,顺便还可以计算出画布的高度

for im in imgs:try:img = Image.open(im).convert('RGB')img_list.append(img)if if_parse:size_list.append(list(img.size))hight += img.size[1]except:pass

try 的使用,就不用怕遍历打开路径的时候遇到非图片而报错停止了

size_lt = sorted(size_list, key=lambda x: x[0])
width = size_lt[-1][0] + 10
canv = Image.new('RGB', (width, hight), (255, 255, 255))
然后就可以遍历贴图了
先获取当前要贴的图片的尺寸,然后用画布宽度减去图片宽度最后整除2得到贴图时左上角坐标,使得图片位置居中
y = 10  # 10 为上边的留白值
for i in range(len(img_list)):size = size_list[i]dx = (width - size[0])//2canv.paste(img_list[i], (dx, y))
y 为每次贴图的 ‘纵’ 坐标,每次贴图后要加上所贴图的高度以及留白值 5, 得到下一次贴图的 ‘纵’ 坐标
y = 10
for i in range(len(img_list)):size = size_list[i]dx = (width - size[0]) // 2canv.paste(img_list[i], (dx, y))img_list[i].close() # 用完就顺手关闭一下图片y += size[1] + 5
  • 另一种情况,图片尺寸一样

    • 先计算画布大小 ,画布宽度即是:随便一张图的宽度+留白值;画布高度即为:图片数x(任一张图的高度+图间留白值)+上下留白值
    • 同样,按尺寸创建画布
canv = Image.new('RGB', \(10 + img_list[0].size[0], 20 + len(img_list)*(img_list[0].size[1] + 5)), (255, 255, 255))

接下来就是没有感情的贴图

for i in range(len(img_list)):canv.paste(img_list[i], (5, 10 + i * (5 + img_list[0].size[1])))img_list[i].close()
  • 再来点内容,白花花的底色,贴完图后加个框吧

draw = ImageDraw.Draw(canv)
draw.rectangle((0, 0, canv.size[0]-1, canv.size[1]-1), outline='black', width=5)

第一个元组参数,前两个是框框左上角的坐标,后两个是框框右下角的坐标
outline 是框框的颜色; width 是框框的宽度

弄完这些,保存一下吧

canv.save(out_path, 'PDF', resolution=100.0, save_all=True)

Ps: 要是不需要拼长图,而是需要一张图,一页pdf,那么就改一下保存的代码。

img_list[0].save(out.path, "PDF", resolution=100.0, save_all=True, append_images=img_list[1:])
这里解释一下,img_list 是Image对象的列表。另,这样的话,效果如下

完整代码如下

from PIL import Image, ImageDraw
from random import randint
import os.path as op
import osdef paste_and_pdf(path, show=True, if_parse=None, out_path=r'c:\users\pxo\desktop\document_{}.pdf'.format(randint(0, 999))):while op.exists(out_path):out_path = r'c:\users\pxo\desktop\document_{}.pdf'.format(randint(0, 999))imgs = [op.join(path, name) for name in os.listdir(path)]size_list, img_list = [], []hight = 20 + 5*len(img_list)for im in imgs:try:img = Image.open(im).convert('RGB')img_list.append(img)if if_parse:size_list.append(list(img.size))hight += img.size[1]except:passif if_parse:size_lt = sorted(size_list, key=lambda x: x[0])width = size_lt[-1][0] + 10canv = Image.new('RGB', (width, hight), (255, 255, 255))y = 10for i in range(len(img_list)):size = size_list[i]dx = (width - size[0])//2canv.paste(img_list[i], (dx, y))img_list[i].close()y += size[1]+5else:canv = Image.new('RGB', (10 + img_list[0].size[0], 20 + len(img_list)*(img_list[0].size[1] + 5)), (255, 255, 255))for i in range(len(img_list)):canv.paste(img_list[i], (5, 10 + i*(5+img_list[0].size[1])))img_list[i].close()draw = ImageDraw.Draw(canv)draw.rectangle((0, 0, canv.size[0]-1, canv.size[1]-1), outline='black', width=5)canv.save(out_path, 'PDF', resolution=100.0, save_all=True)if show:canv.show()def old_paste_pic():#  im1.save(pdf_name, "PDF", resolution=100.0, save_all=True, append_images=im_list)path = r'c:\users\pxo\desktop\tt'imgs = [op.join(path, name) for name in os.listdir(path)]size = Image.open(imgs[0]).sizenew = Image.new('RGB', (size[0], size[1]*len(imgs)))for i in range(len(imgs)):im = Image.open(imgs[i])new.paste(im, (0, size[1]*i))new.show()new.save(op.join(path, 'new.jpeg'), quality=90)def main():path = r'c:\users\pxo\desktop\ttt'out_path = op.join(path, 'out.pdf')paste_and_pdf(path, if_parse=1, out_path=out_path)main()

Python 多图拼接,多图转PDF,一气呵成相关推荐

  1. android 照片拼接长图_android多图拼接长图并合理显示

    android多图拼接长图并合理显示 发布时间:2018-04-06 09:31, 浏览次数:541 , 标签: android 以前说过了 重叠部分图片合成,今天说一下 canvas.drawBit ...

  2. android 照片拼接长图_android多图拼接长图并合理显示-Go语言中文社区

    以前说过了 重叠部分图片合成,今天说一下canvas.drawBitmap拼接长图 先上效果gif 需求:多图拼接长图,长图大小 宽度为屏幕,高度自己不变形成比例 核心源码1.:final int m ...

  3. dataframe 拼接_拼接关系图在石材生产过程中的重要性

    石材生产加工中应用许多图,石材纹理图.平面面置图.平面图.立面图.剖面图,这些图对石材生产加工都有很大的帮助,发挥着各自的作用,担负着各自的角色.除了这些图外,石材生产加工中还有一种图-拼接关系图,表 ...

  4. 小技巧!如何把小图拼接成长图,将长图切成小图

    作为电商来说,经常要将商品详情里的小图用短时间来拼接成一张大图,又要将一整张大图剪切成若干小图.如果这要用PS来拼切长短图,也是一个不小的麻烦事,关键是还不能一次性批量完成.今天小编要介绍一个可以快速 ...

  5. Golang PDF转图片 拼接长图 压缩PDF及图片 输出JPEG

    PDF转PNG主要是用到Xpdf的库 根据操作系统选择命令行工具下载- Download the Xpdf command line tools: 在bin64目录下可以找到PDFTOPNG可执行文件 ...

  6. Python自动化办公--长图拼接,视频合并

    Python自动化办公–长图拼接,视频合并 点击访问我的博客系统,了解更多有趣内容哦

  7. python多图拼接并利用resnet提取特征

    代码功能: 1.将多张图拼接成一张大图: 2.基于resnet提取大图的特征. import torch import torch.nn as nn from torchvision import m ...

  8. python实现将ppt内容导出为图片并拼接成长图

    一个完整的车轮子- 参数1输入绝对路径,参数2输出带后缀的文件名称. 生成的长图会直接生成在和ppt所在的同级目录. 同时会生成一个和ppt名称一样的目录,用于存放每页ppt的图片. # -*- co ...

  9. python实现将一幅图拼接到另一幅图上

    # Standard imports import cv2 import numpy as np import os import matplotlib.pyplot as plt # Read im ...

最新文章

  1. Linux下Chrome/Chromium窗口边框有白线
  2. Spring Cloud Alibaba到底坑不坑?反正是解放了部分使用的繁琐!
  3. 对于PHP框架的简单认识
  4. django项目如何连接前端_工作笔记前端小白如何搭建前端项目
  5. Android应用程序创建桌面快捷方式
  6. dragon编译linux,在Linux系统中安装Alibaba Dragonwell8的方法
  7. Swift语言中的#ifdef替换
  8. 电商扣减库存_电商后台产品经理宝典
  9. RH850 MPU 实现介绍
  10. 32 位和 64 位版本的 Office 2010 之间的兼容性,同样适用于AutoCAD的VBA兼容性--VBA 64 32 调用dll的区别
  11. 哇!大开脑洞!“绿协杯”东莞市第六届绿色建筑设计比赛【往期获奖作品回顾上篇】
  12. PHP+实验室安全系统 毕业设计-附源码191610
  13. FIDO android客户端认证
  14. python基础学习与应用
  15. 许路平:Gvoice千万在语音输入的那些事
  16. 你应该知道的requestIdleCallback
  17. (ICML-2020)通过超球面的对齐和均匀性理解对比表示学习(一)
  18. 【图文并茂】如何进行Win7系统的重装
  19. 乐信、趣店同源“异路”
  20. 洛谷OJ U552 守墓人 线段树模板题

热门文章

  1. [原创]基于Comsol的方形、三角形、椭圆形克拉尼板仿真研究
  2. 【WEB漏洞】第三章 XSS(一)
  3. 同事离职,留下了我独自流泪改代码
  4. js正则表达式验证文件扩展名
  5. python flask教程百度云,Python Web框架Flask中使用百度云存储BCS实例
  6. iPhone 7-b
  7. 新零售来袭,企业如何利用物联网卡转型升级?
  8. 海淀园为知识产权开“淘宝”
  9. 国内工业相机十大排名
  10. ListView(一)