Python如何通过for循环批量转换子文件夹内.obj图片为.jpg格式
实现思路
- 先明确格式特性:
.obj是3D网格模型文件,不是普通2D图片,不能直接改后缀实现格式转换,必须经过模型加载、离屏渲染的步骤才能输出为.jpg格式的2D图像 - 遍历逻辑:用路径递归遍历的方式扫描根目录及下属所有子文件夹,筛选出所有后缀为
.obj的文件,逐个处理即可覆盖两个子文件夹内的全部目标文件 - 处理流程:对每个遍历到的obj文件,先加载3D模型,配置基础的相机、光照参数完成离屏渲染,将渲染得到的RGB图像保存为和原文件同名的jpg即可,建议单独设置输出目录存放转换后的jpg,避免和原文件混杂
- 容错处理:加简单的异常捕获逻辑,遇到损坏、无法加载的obj文件直接跳过,不会中断整个批量转换任务
参考实现(Python)
首先安装依赖包,在命令行执行:pip install trimesh pyrender numpy pillow PyOpenGL
对应代码如下:
import os import trimesh import pyrender import numpy as np from PIL import Image # 配置路径 ROOT_FOLDER = "替换成你的根目录绝对路径" # 示例值:"D:/3d_models" OUTPUT_FOLDER = "替换成jpg输出目录路径" os.makedirs(OUTPUT_FOLDER, exist_ok=True) # 初始化渲染器,可自行修改输出分辨率 renderer = pyrender.OffscreenRenderer(viewport_width=1920, viewport_height=1080) # 递归遍历根目录下所有文件 for root_path, _, file_list in os.walk(ROOT_FOLDER): for file_name in file_list: # 筛选obj格式文件 if not file_name.lower().endswith(".obj"): continue obj_full_path = os.path.join(root_path, file_name) try: # 加载obj模型 mesh = trimesh.load(obj_full_path, force="mesh") # 自动归一化模型大小,适配渲染窗口 mesh_extent = mesh.extents.max() mesh.apply_scale(1 / mesh_extent) # 搭建渲染场景 scene = pyrender.Scene() scene.add(pyrender.Mesh.from_trimesh(mesh)) # 添加默认透视相机 camera = pyrender.PerspectiveCamera(yfov=np.pi / 3.0) camera_pose = np.array([ [1.0, 0.0, 0.0, 0.0], [0.0, 1.0, 0.0, 0.0], [0.0, 0.0, 1.0, 2.0], [0.0, 0.0, 0.0, 1.0] ]) scene.add(camera, pose=camera_pose) # 添加默认光照 light = pyrender.DirectionalLight(color=np.ones(3), intensity=3.0) scene.add(light, pose=camera_pose) # 渲染得到RGB图 color, _ = renderer.render(scene) # 保存为jpg output_jpg_name = f"{os.path.splitext(file_name)[0]}.jpg" output_jpg_path = os.path.join(OUTPUT_FOLDER, output_jpg_name) Image.fromarray(color).save(output_jpg_path, quality=95) print(f"转换完成: {output_jpg_name}") except Exception as e: print(f"文件{file_name}转换失败,跳过: {str(e)}") # 释放渲染器资源 renderer.delete()
提示:如果需要调整渲染视角、图片分辨率、光照强度/颜色,直接修改代码里对应参数即可。如果你的obj文件带贴图,只要mtl贴图文件和obj在同目录下,trimesh会自动加载贴图渲染。
内容的提问来源于stack exchange,提问作者mlope441
相关产品推荐
相关产品推荐

