当A0图纸遇到A4打印机和老眼昏花是恐怕就是小年轻也要跳起来说看不清。没关系我们用Python的OpenCV库可以很方便的庖丁解牛,把大图分割成几张大小相同的小图,而后在保证分辨率的前提下打印出来。
为了简单期间,此处程序直接固定读取存放在路径:D:\data\pic下名字为000.jpg的图片,而后切割好的的图片放到目录D:\data\output\pic下。
好了废话不多说,上程序:
import cv2
picture_path = r"d:/data/pic/000.jpg"
picture_save_path = r"d:/data/output/pic"
#参数列表 Vnumber:纵向图片数量
# VSize:图片大小,A3L 为A3纵向
# A3W A3横向
# A4L A4纵向
# A4W A4横向
Vnumber=4
VSize='A4W'
target_channel = 3
picture = cv2.imread(picture_path)
H = picture.shape[0]
W = picture.shape[1]
C = picture.shape[2]
C_number = C
print("像素行数={}".format(H))
print("像素列数={}".format(W))
print("像素色域通道数={}".format(C))
H_number=Vnumber
VPSize=H/Vnumber
if(VSize=='A3L'):
W_number=int(W/VPSize*(42/29.7)+0.5)
if(VSize=="A3W"):
W_number =int( W /VPSize * (29.7 /42)+0.5)
if(VSize=='A4L'):
W_number=int(W/VPSize*(29.7/21)+0.5)
if(VSize=="A4W"):
W_number =int( W /VPSize * (21 /29.7)+0.5)
target_width = int(W/W_number)
target_high = int(VPSize)
for i in range(0, H_number):
for j in range(0, W_number):
mask = picture[i * target_high:(i + 1) * target_high, j * target_width:(j + 1) * target_width, :]
save_picture =picture_save_path +"_{}_{}.jpg".format(i + 1, j + 1)
cv2.imwrite(save_picture, mask)
print("finished!!!")
实际使用时,可通过修改Vnumber和VSize来设定输出小图的数量和幅面大小。 其中:
Vnumber是垂直方向上切割图片的数量。程序可自行计算水平所需的图片数量,以保证图片的纵横比不变化。
VSize是输出小图的幅面类型,这里程序中预设了A3,A4两种幅面,纵向和横向两种板式共四种输出类型。
下面我们验证一下程序。以一张民国时期的老南京地图为例,按垂直方向切割为4份A4横向幅面小图
切割后小图如下
切图成功,以后再也不会为硬件工程师画的A0图纸不好打印发愁了。
后记
本文于2024.2.20 日首发于“车灯电子扫地僧”。 如果你喜欢我的文章,也可以“车灯电子扫地僧”搜索微信订阅号。更多文章等待您的发掘.