Skip to content

Python快速输出定制程序批处理项目物料案例

945字约3分钟

Python

2024-05-31

Python快速输出定制程序批处理项目物料案例

众所周知python脚本所能集成的生态库非常丰富,在项目中,想要对一些物料文件进行特殊定制处理时,前端程序往往无能为力,而C和Java的开发又较为笨重,这时python脚本编译的处理工具就体现了它的优势,本文描述了两个项目应用python脚本的案例,以展示其中的使用场景。

案例一:需要将几个超大尺寸地图拼接成一张地图,但是地图物料尺寸已经大到图像处理软件读取后出现内存不足的情况。

import cv2
import numpy as np

这里利用了python的opencv2库,它可以仅仅在数据层面上对图片做拼合,并写入新的文件。numpy用于数组运算,把图像的像素阵列拼接转化为二维数组的拼接:

# 读取三张图片
img1 = cv2.imread('1c.jpg')
img2 = cv2.imread('2c.jpg')
img3 = cv2.imread('3c.jpg')

# 将三张图片拼接成一张图片
result = np.concatenate((img1, img2, img3), axis=0)

# 保存拼接后的图片
cv2.imwrite('20k.jpg', result)

运行完成后,新处理完成的图片输出到脚本所在目录。

案例二:三方建模厂商输出建筑平面图时,图中含有四周的不定宽度的透明边距,但是在物料交付后,后期的新增需求需要完全不含边距的平面图(也就是建筑轮廓应当顶到图片4个边),物料数量很大,人工处理会相当耗费人力。

由于需求中需要对图像的像素进行逻辑处理,所以引入PIL图像处理库即可。

from PIL import Image
import os

这里需要定义一个处理函数crop_transparent_area,用于剔除掉一张图片的透明部分。读取到图像数据后,对所有像素点的RGBA的透明通道做遍历,最终记录上下左右四个方向上的最后一列全透明像素的位置。

遍历完成后,用 crop 函数对图像文件完成裁剪处理。

def crop_transparent_area(image_path, output_file_path):
    img = Image.open(image_path)
    img = img.convert("RGBA")
    datas = img.getdata()

    left = img.width
    right = 0
    top = img.height
    bottom = 0

    for x in range(img.width):
        for y in range(img.height):
            if datas[y * img.width + x][3] != 0:
                left = min(left, x)
                right = max(right, x)
                top = min(top, y)
                bottom = max(bottom, y)

    if left >= right or top >= bottom:
        return

    img.crop((left, top, right + 1, bottom + 1)).save(output_file_path)

再编写一个文件批量处理模块:os.walk可以深入到目录内的所有子目录,并匹配所有扩展名为png的文件进行处理。

处理后的输出提供了两种模式,覆盖原文件或者新建文件,在原文件名后加上后缀表示是处理后的。


def batch_crop_transparent_area(folder_path):
    for root, dirs, files in os.walk(folder_path):
        for filename in files:
            if filename.endswith('.png'):
                input_file_path = os.path.join(root, filename)
                # 不覆盖源文件
                # output_file_path = os.path.splitext(input_file_path)[0] + '_processed.png'
                # 直接覆盖源文件
                output_file_path = input_file_path
                print(f'开始处理文件:{input_file_path}')
                crop_transparent_area(input_file_path, output_file_path)
    print('处理完成')

batch_crop_transparent_area('./')

对一个文件夹内的的物料处理运行后的效果如下图:

python脚本的运行需要依赖运行的电脑里安装环境,但如果想把这些功能便携地提供给现场交付的话,也可以把脚本直接编译打包成可执行地exe小工具。

先安装依赖包:pip install pyinstaller

之后在脚本文件所在目录执行命令 Pyinstaller -F xxx.py ,就可以方便地把脚本地功能编译成一个独立的exe提供给现场了。