图像处理与办公文档
文章目录
前言
用程序来处理图像和办公文档经常出现在实际开发中,Python的标准库中虽然没有直接支持这些操作的模块,但我们可以通过Python生态圈中的第三方模块来完成这些操作。
一. 图像操作
1.1 图像的基础知识
-
颜色。如果你有使用颜料画画的经历,那么一定知道混合红、黄、蓝三种颜料可以得到其他的颜色,事实上这三种颜色就是被我们称为美术三原色的东西,它们是不能再分解的基本颜色。在计算机中,我们可以将红、绿、蓝三种色光以不同的比例叠加来组合成其他的颜色,因此这三种颜色就是色光三原色,所以我们通常会将一个颜色表示为一个RGB值或RGBA值(其中的A表示Alpha通道,它决定了透过这个图像的像素,也就是透明度)。
名称 RGBA值 名称 RGBA值 White (255, 255, 255, 255) Red (255, 0, 0, 255) Green (0, 255, 0, 255) Blue (0, 0, 255, 255) Gray (128, 128, 128, 255) Yellow (255, 255, 0, 255) Black (0, 0, 0, 255) Purple (128, 0, 128, 255) -
像素。对于一个由数字序列表示的图像来说,最小的单位就是图像上单一颜色的小方格,这些小方块都有一个明确的位置和被分配的色彩数值,而这些一小方格的颜色和位置决定了该图像最终呈现出来的样子,它们是不可分割的单位,我们通常称之为像素(pixel)。每一个图像都包含了一定量的像素,这些像素决定图像在屏幕上所呈现的大小。
1.2 用Pillow操作图像
Pillow是由从著名的Python图像处理库PIL发展出来的一个分支,通过Pillow可以实现图像压缩和图像处理等各种操作。可以使用下面的命令来安装Pillow。
pip install pillow
就可以下载到pillow库及其相关库。
Pillow中最为重要的是Image类,读取和处理图像都要通过这个类来完成。
from PIL import Image
# 读取图片
image = Image.open('tangmumao.jpeg')
image.show()
# 常见的一些小操作:
# 1. 剪裁图像
image = Image.open('tangmumao.jpeg')
rect = 80, 20, 310, 360
image.crop(rect).show()
# 2. 生成缩略图
image = Image.open('tangmumao.jpeg')
size = 128, 128
image.thumbnail(size)
image.show()
# 3. 缩放和黏贴图像
image1 = Image.open('tangmumao.jpeg')
image2 = Image.open('tangmumao.jpeg')
rect = 80, 20, 310, 360
guido_head = image2.crop(rect)
width, height = guido_head.size
image1.paste(guido_head.resize((int(width / 1.5), int(height / 1.5))), (172, 40))
# 4. 旋转和翻转
image = Image.open('tangmumao.jpeg')
image.rotate(180).show()
image.transpose(Image.FLIP_LEFT_RIGHT).show()
# 5. 操作像素
image = Image.open('tangmumao.jpeg')
for x in range(80, 310):
for y in range(20, 360):
image.putpixel((x, y), (128, 128, 128))
image.show()
# 6. 滤镜效果
from PIL import Image, ImageFilter
image = Image.open('tangmumao.jpeg')
image.filter(ImageFilter.CONTOUR).show()
这里提供一张照片供大家实践(也可以用自己的照片,都是可以的)。
前面几个案例做出来的效果过是这样的:
二. 办公文档类相关简单操作
2.1 处理Excel
Python的openpyxl模块让我们可以在Python程序中读取和修改Excel电子表格,由于微软从Office 2007开始使用了新的文件格式,这使得Office Excel和LibreOffice Calc、OpenOffice Calc是完全兼容的,这就意味着openpyxl模块也能处理来自这些软件生成的电子表格。
import datetime
from openpyxl import Workbook
wb = Workbook() # 工作簿
ws = wb.active # 激活
ws['A1'] = 133 # 添加内容
ws.append([1, 2, 3])
ws['A2'] = datetime.datetime.now() # 运行时的时间
wb.save("sample.xlsx") # excel的保存
# excel一般有好几种后缀,有`.xlsx`或者`.lsx`.当然了,`CSV文件`长的也跟excel差不多。
2.2 处理Word
利用python-docx模块,Python可以创建和修改Word文档,当然这里的Word文档不仅仅是指通过微软的Office软件创建的扩展名为docx的文档,LibreOffice Writer和OpenOffice Writer都是免费的字处理软件。
from docx import Document
from docx.shared import Inches
document = Document()
document.add_heading('Document Title', 0)
p = document.add_paragraph('A plain paragraph having some ')
p.add_run('bold').bold = True
p.add_run(' and some ')
p.add_run('italic.').italic = True
document.add_heading('Heading, level 1', level=1)
document.add_paragraph('Intense quote', style='Intense Quote')
document.add_paragraph(
'first item in unordered list', style='List Bullet'
)
document.add_paragraph(
'first item in ordered list', style='List Number'
)
document.add_picture('tangmumao.jpeg', width=Inches(1.25))
records = (
(3, '101', 'Spam'),
(7, '422', 'Eggs'),
(4, '631', 'Spam, spam, eggs, and spam')
)
table = document.add_table(rows=1, cols=3)
hdr_cells = table.rows[0].cells
hdr_cells[0].text = 'Qty'
hdr_cells[1].text = 'Id'
hdr_cells[2].text = 'Desc'
for qty, id, desc in records:
row_cells = table.add_row().cells
row_cells[0].text = str(qty)
row_cells[1].text = id
row_cells[2].text = desc
document.add_page_break()
document.save('demo.docx')
2.3 处理PDF
# 1.PDF的拆分
from PyPDF2 import PdfFileReader, PdfFileWriter
def pdf_split(filename, split_name):
pdf = PdfFileReader(filename)
# 拆分,即读取PDF中的每页,单独进行保存
for page in range(pdf.getNumPages()):
pdf_writer = PdfFileWriter()
pdf_writer.addPage(pdf.getPage(page))
output = f"{split_name}{page}.pdf"
with open(output, "wb") as output_pdf:
pdf_writer.write(output_pdf)
filename = "需要拆分的PDF"
pdf_split(filename, "存放拆分的PDF的地址")
# 2. PDF的合并
from PyPDF2 import PdfFileReader, PdfFileWriter
def merge_pdfs(paths, output):
pdf_writer = PdfFileWriter()
for path in paths:
pdf_reader = PdfFileReader(path)
for page in range(pdf_reader.getNumPages()):
# 将每页添加到writer对象
pdf_writer.addPage(pdf_reader.getPage(page))
# 写入合并的PDF
with open(output, "wb") as out:
pdf_writer.write(out)
paths = ["需要合并的PDF1", "需要合并的PDF2"]
merge_pdfs(paths, output="存放合并后的PDF的位置")
先用这两个简单的PDF操作吧,后面学到了更多的,再继续分享给各位小伙伴。
2.4 处理PPT
from pptx import Presentation
# 实例化Prerentation
ppt = Presentation()
# 使用ppt自带的模版,ppt自带了1-48中模版
title_slide_layout = ppt.slide_layouts[0]
# 新建一页ppt
slide = ppt.slides.add_slide(title_slide_layout)
# 设置标题
title = slide.shapes.title
# 使用placeholdes索引获取一页ppt中的元素
subtitle = slide.placeholders[1]
# 设置text
title.text = "Hello,World!"
subtitle.text = "PPT自动化 from python-pptx"
# 保存文件
ppt.save("../data/demo.pptx") # 到这里就完成了一页PPT的编写
# 新建一页ppt
title_slide_layout = ppt.slide_layouts[5]
slide = ppt.slides.add_slide(title_slide_layout)
# 添加新文本框
from pptx.util import Inches
# 预设位置及大小
left, top = Inches(0.5), Inches(1.6)
width, height = Inches(4), Inches(1)
# left, top为相对位置,width,heigt为绝对位置
textbox = slide.shapes.add_textbox(left, top, width, height)
# 文本框中文字
textbox.text = "this is a new textbox"
# 在文本框中添加段落
new_para = textbox.text_frame.add_paragraph()
# 段落文字
new_para.text = "this is second paragraph in textbox"
# 文件路径
img_path = "../data/pic.jpg"
# 预设位置及大小
left, top, width, height = Inches(0.5), Inches(2.5), Inches(8), Inches(5)
# 在指定文职按预设添加图片
pic = slide.shapes.add_picture(img_path, left, top, width, height)
# 最后记得保存PPT
总结
本文主要讲了几个实用的库,如Pillow库主要是用来做图像处理的,而且是个高级库(基本上常用的函数都帮你封装好了),大家可以用来修图啊,都是可以的,而且效果会比一般的软件自带的修图工具还好些。然后就是关于办公类的,我们日常生活中常见的文件类型(Excel,Word,PDF,PPT)等,相关库的简单介绍,以及一个小例子,算抛砖引玉吧,大家可以熟练掌握之后,结合自己的idea,不断丰富自己的内容。
在这里提个醒,就是说,我们如果不熟练的话,其实还不如直接在相关软件上操作,但是为啥这里会提到用Python进行操作呢,主要还是因为编程特别适用于重复性,工作量大的工作。例如你要写10000份关于员工信息的Word文档,而且内容基本一致,只是如姓名,工号,性别,工资几个不同,其他的内容一致,那就可以把这几个地方空出来,然后把模版弄好,通过excel把这些员工信息导入,做个循环一个一个的填嘛,但是计算机的速度肯定是比你快很多倍吧,而且最重要的是不会出错,对吧,除非你excel表上的员工信息错了,那没办法。其他的办公软件也类似嘛(重复,量大,重复,量大,重复,量大,重要的事情说三遍!)。
溜了溜了,脑壳疼。Loading(15/100)。。。