扫描后自动化批量翻转、分割图片文件
Python编程辅助办公
文章目录
前言
日常办公时经常会需要扫描整本资料成PDF以供阅读,现在的大型复印一体机一般都可以批量扫描,并且保存成一个PDF文件,但在实际操作中,双面和A3纸的文件扫描就会有另外的问题,比如文件偏转了90度,而且一张向左一张向右。这个问题可以用图片查看器一张张的查看和翻转,但在页数多的时候就很费时费精力,作为懂一点PYTHON编程的人,怎么能容忍机械化重复的操作呢?自动化编程走起!
一、需要的准备
首先需要安装python环境和PIL库,python安装就不缀述了,PIL库也是最常见的图片库之一,没什么门槛。
pip install Pillow
二、编程步骤
1.需求分析
我自己的问题是图片为A3,资料是A3打印然后从中间订上的,拆开后就成了A3全页纸,自动扫描后一页向左一页向右,而且左右各为一页,两页并不相关,所以我的需要是第一张逆时针旋转90度,第二张顺时针旋转90度,依次类推使所有页都文字朝上,然后从中间分割开。
所以我的情况需要编程的内容是:
a 批量查看文件夹下所有图片文件
b 单数文件逆时针旋转90度,双数文件顺时针旋转90度
c 图片文件摆正之后,从正中间切割为左右两半,分别保存
2.开始写代码
首先导入PIL和OS库,OS库这里的作用是文件操作:
import os
from PIL import Image
使用OS库查找本文件夹下的所有图片文件
#查找本文件夹目录给 image_dir
image_dir = os.path.dirname(os.path.abspath(__file__))
# 遍历目录中的所有图片文件
for filename in os.listdir(image_dir):
if filename.endswith('.png') or filename.endswith('.jpg'):
扫描的一些黑白文件会保存成TIF后缀的文件,以上代码自己改一下就行
下一步,判断此文件的奇偶,为了方便,自己定义了一个小程序,查看文件名最后一位,奇数返回真,否则是假
#判断奇偶
def check_odd(str):
# 获取倒数第5个字符
last_digit = str[-5]
# 判断是否是奇数
if int(last_digit) % 2 != 0:
return True
else:
return False
找到图片文件后打开,如果是奇数就逆时针旋转90度,不是就顺时针逆转90度。这里我用另一个变量保存的结果,只是当时调试需要,不是必要。最后旋转后的图片在imgr这个变量里。
# 打开图片文件
image = Image.open(os.path.join(image_dir, filename))
imgr = image
#判断奇数图片向左转90度,逆时针,偶数向右转90度
if check_odd(filename):imgr=image.transpose(Image.ROTATE_90)
else:imgr=image.transpose(Image.ROTATE_270)
现在得到的图片已经是A3横向了,左右各有一页,互不相关的页数,比如第9页和第40页,现在需要把它们分开,所以下一步,图片中间切割各自保存,先建立了一个叫”单页“的文件夹,然后所有切割后的文件自动放进去。
#建立单页文件夹
try:os.mkdir(‘单页’)
except:print(' 单页 文件夹已存在')
# 获取图片文件的宽度和高度
width, height = imgr.size
# 将图片文件切割为两个半部分
left_half = imgr.crop((0, 0, width // 2, height))
right_half = imgr.crop((width // 2, 0, width, height))
# 将两个半部分保存为新的文件
left_half.save(os.path.join(image_dir+'\\单页', 'left_' + filename))
right_half.save(os.path.join(image_dir+'\\单页', 'right_' + filename))
到这里编程已经结束,自动运行一下,就会把PYTHON文件所在的所有JPG和PNG的图片文件,按照文件名的奇偶,自动翻转、切割保存为单页的图片文件了。
对办公的我来说,这并没有结束,还需要一个个的分页写上页码,再用PDF合成器,但这种编程需要识别文字,而且总有不少无法识别的最后要手动,这里就不放代码了。
总结
本文通过PYTHON编程里PIL库和OS库的简单应用,实现了批量自动旋转和切割图片的功能,使图片变成了一个个的单页正向,希望对办公的你有所帮助,以下是可运行的一个全代码:
from PIL import Image
import os
#本文件夹
current_directory = os.path.dirname(os.path.abspath(__file__))
#指定图片文件所在的目录
image_dir = current_directory
sfolder='单页'
if os.path.exists(sfolder):pass
else:os.makedirs(sfolder)
#判断奇偶
def check_odd(str):
# 获取倒数第5个字符
last_digit = str[-5]
# 判断是否是奇数
if int(last_digit) % 2 != 0:
return True
else:
return False
#遍历目录中的所有图片文件
for filename in os.listdir(image_dir):
if filename.endswith('.tif') or filename.endswith('.jpg'):
print(filename)
# 打开图片文件
image = Image.open(os.path.join(image_dir, filename))
imgr = image
width, height = image.size
#判断奇数图片向左转90度,逆时针,偶数向右转90度
if check_odd(filename):imgr=image.transpose(Image.ROTATE_90)
else:imgr=image.transpose(Image.ROTATE_270)
# 获取图片文件的宽度和高度
width, height = imgr.size
# 将图片文件切割为两个半部分
left_half = imgr.crop((0, 0, width // 2, height))
right_half = imgr.crop((width // 2, 0, width, height))
# 将两个半部分保存为新的文件
left_half.save(os.path.join(image_dir+'\\'+sfolder, 'left_' + filename))
right_half.save(os.path.join(image_dir+'\\'+sfolder, 'right_' + filename))
以上代码仅实现了这个单一的功能,想要根据自己情况写具体办公辅助应用的,可以自行修改一下代码,或者联系我直接要EXE可运行的WINDOWS版。