diff --git a/post_pro/merge_obj.py b/post_pro/merge_obj.py index 0240f3e..c10813f 100644 --- a/post_pro/merge_obj.py +++ b/post_pro/merge_obj.py @@ -5,6 +5,7 @@ from typing import Dict import pandas as pd import shutil import time +import cv2 class MergeObj: @@ -211,7 +212,7 @@ class MergeObj: return materials def copy_and_rename_texture(self, src_dir: str, dst_dir: str, grid_id: tuple) -> dict: - """复制并重命名纹理文件 + """复制并重命名纹理文件,对大于100MB的文件进行下采样 Args: src_dir: 源纹理目录 dst_dir: 目标纹理目录 @@ -224,15 +225,36 @@ class MergeObj: for file in os.listdir(src_dir): if file.lower().endswith(('.png', '.jpg', '.jpeg')): - # 生成新的文件名:grid_0_1_texture.png + # 生成新的文件名 new_name = f"grid_{grid_id[0]}_{grid_id[1]}_{file}" src_path = os.path.join(src_dir, file) dst_path = os.path.join(dst_dir, new_name) - # 复制文件 - shutil.copy2(src_path, dst_path) + # 检查文件大小(以字节为单位) + file_size = os.path.getsize(src_path) + if file_size > 100 * 1024 * 1024: # 大于100MB + self.logger.info(f"纹理文件 {file} 大于100MB,进行4倍下采样") + # 读取图像 + img = cv2.imread(src_path, cv2.IMREAD_UNCHANGED) + if img is not None: + # 计算新的尺寸(长宽各变为1/4) + new_size = (img.shape[1] // 4, img.shape[0] // 4) + # 使用双三次插值进行下采样 + resized_img = cv2.resize(img, new_size, interpolation=cv2.INTER_CUBIC) + # 保存压缩后的图像 + if file.lower().endswith('.png'): + cv2.imwrite(dst_path, resized_img, [cv2.IMWRITE_PNG_COMPRESSION, 9]) + else: + cv2.imwrite(dst_path, resized_img, [cv2.IMWRITE_JPEG_QUALITY, 95]) + else: + self.logger.warning(f"无法读取图像文件: {src_path}") + shutil.copy2(src_path, dst_path) + else: + # 文件大小未超过100MB,直接复制 + shutil.copy2(src_path, dst_path) + texture_map[file] = new_name - self.logger.debug(f"复制纹理文件: {file} -> {new_name}") + self.logger.debug(f"处理纹理文件: {file} -> {new_name}") return texture_map