commit 39371ee333520ec89c1b5486360cc5b83b9e3646 Author: yi.cheng Date: Tue Aug 22 10:27:43 2023 +0800 first commit diff --git a/check_compress_psd.py b/check_compress_psd.py new file mode 100644 index 0000000..1563815 --- /dev/null +++ b/check_compress_psd.py @@ -0,0 +1,254 @@ +#!/usr/bin/python +#encoding:utf-8 +import os, sys + +curr = os.path.dirname(sys.argv[0]) +if curr != "": + os.system("cd " + curr) + +from psd_tools import PSDImage +from PIL import Image +import hashlib +import utils +import export_outline +import json + +def parse_psd(path): + global scale + global versions + + file_name = os.path.split(path)[1] + + log = [] + + log.append("开始检测:{}".format(file_name)) + + psd = PSDImage.open(path) + try: + image = psd.composite() + except Exception as e: + log.append("文件无法打开" + repr(e)) + + has_base = False + has_finish = False + lines = {} + patch_stages = {} + auto_stages = {} + + #patch的末尾数字 + patch_end = [] + line_end = [] + + max_width = 0 + max_height = 0 + + for item in psd.descendants(): + if not item.is_group(): + nArr = item.name.split('_') + + if item.name == "base": + max_width = item.width + max_height = item.height + break + + for item in psd.descendants(): + if not item.is_group(): + nArr = item.name.split('_') + + if item.name == "base": + max_width = item.width + max_height = item.height + + if item.name.strip() != item.name: + log.append("命名中存在空格:{}".format(item.name)) + + if nArr[0] == 'base': + if has_base: + log.append("存在多个base图层") + has_base = True + elif nArr[0] == 'finish': + if has_finish: + log.append("存在多个finish图层") + has_finish = True + elif nArr[0] == 'line': + #以前存在line_1,整图轮廓的情况,这种情况视为无line + if len(nArr) > 2: + if nArr[1] not in lines: + lines[nArr[1]] = [] + if nArr[2] in lines[nArr[1]]: + log.append("存在重复图层:{}".format(item.name)) + lines[nArr[1]].append(nArr[2]) + else: + pass + + line_end.append(item.name.replace("line", "")) + elif nArr[0] == 'patch' or nArr[0] == 'patchrp': + if nArr[1] not in patch_stages: + patch_stages[nArr[1]] = [] + + patch_stages[nArr[1]].append(nArr[2]) + + patch_end.append(item.name.replace("patch", "")) + elif nArr[0] == 'auto': + if nArr[1] not in auto_stages: + auto_stages[nArr[1]] = [] + + auto_stages[nArr[1]].append(nArr[2]) + elif nArr[0] == 'thumbnail' or nArr[0] == 'role' or nArr[0] == 'rptmp': + pass + else: + log.append("命名错误:{}\n".format(item.name)) + + #空图层检测 + if item.width <= 0 or item.height <= 0: + log.append("存在空图层:{}\n".format(item.name)) + + #横坐标越界检测 + if item.offset[0] < 0 or (item.offset[0] + item.width) > max_width: + log.append("横坐标越界{}\n".format(item.name)) + + #纵坐标越界检测 + if item.offset[1] < 0 or (item.offset[1] + item.height) > max_height: + log.append("纵坐标越界{}\n".format(item.name)) + + if not has_base: + log.append("未检测到base图层\n") + + if not has_finish: + log.append("未检测到finish图层\n") + + for stage in patch_stages: + tmp = {} + for item in patch_stages[stage]: + if item in tmp: + log.append("存在重复图层:patch_{}_{}".format(stage, item)) + else: + tmp[item] = 0 + + for stage in auto_stages: + tmp = {} + for item in auto_stages[stage]: + if item in tmp: + log.append("存在重复图层:auto_{}_{}".format(stage, item)) + else: + tmp[item] = 0 + + if len(lines) > 0 and len(patch_stages) != len(lines): + log.append("阶段与线稿不对应,线稿:{} 关卡:".format(len(lines), len(patch_stages))) + + for item in patch_end: + if item not in line_end: + log.append("patch图层找不到描线:patch{}".format(item)) + + for item in line_end: + if item not in patch_end: + log.append("描线找不到patch图层:line{}".format(item)) + + log.append("检测结束") + + if len(log) == 2: + return True, len(lines) > 0 + else: + for a_log in log: + print(a_log) + return False, len(lines) > 0 + +def convert_2_zip_file(path): + file_info_arr = os.path.split(path) + file_path = file_info_arr[0] + file_name = os.path.split(path)[1] + + #检测成功,压缩到zip + os.chdir(file_path) + file_name_without_ex = file_name.split(".")[0] + utils.zip_file("{}.psd".format(file_name_without_ex), "{}.zip".format(file_name_without_ex)) + os.chdir("../") + os.remove(path) + +###生成version文件 +def make_version_file(remake): + version_file = 'version.json'; + + if remake: + if os.path.exists(version_file): + os.remove(version_file) + + if not os.path.exists(version_file): + with open(version_file, 'w') as f: + json.dump({}, f, sort_keys=True, indent=4) + +###加载版本文件 +def load_version(): + global versions + make_version_file(False); + with open('version.json', 'r') as f: + try: + versions = json.load(f) + except: + #删除版本文件并重新生成 + make_version_file(True); + +def write_version(): + with open('version.json', 'w') as f: + json.dump(versions, f, sort_keys=True, indent=4) + +if __name__ == '__main__': + load_version() + deal_psdid = [] + is_force = sys.argv[1] if len(sys.argv) > 1 else False + for root , dirs, files in os.walk('./'): + for name in files: + src_file = os.path.join(root, name) + + if name.endswith('.psd') or name.endswith('.zip'): + file_info_arr = os.path.split(src_file) + file_path = file_info_arr[0] + file_name = file_info_arr[1] + key = file_name.split("_")[0] + try: + i_key = int(key) + except Exception as e: + print("资源命名错误,请查询是否存在特殊字符:{}".format(name)) + continue + + if key not in deal_psdid: + deal_psdid.append(key) + else: + print("存在重复关卡:{}".format(key)) + + if name.endswith('.psd') or (name.endswith('.zip') and is_force): + file_info_arr = os.path.split(src_file) + file_path = file_info_arr[0] + file_name = file_info_arr[1] + + key = file_name.split("_")[0] + hash_old = "" + if key in versions: + hash_old = versions[key] + + if os.path.exists(src_file): + hash_now = "" + if name.endswith('.psd'): + hash_now = utils.calc_hash(src_file) + + if hash_now != hash_old or is_force: + psd_file = src_file + if name.endswith('.zip'): + utils.unzip_file(src_file) + psd_file = "{}.psd".format(os.path.splitext(psd_file)[0]) + hash_now = utils.calc_hash(psd_file) + + try: + ret, has_line = parse_psd(psd_file) + if ret: + if not has_line: + export_outline.export_outline(psd_file) + + #检测成功,压缩到zip + convert_2_zip_file(psd_file) + versions[key] = hash_now + write_version(); + except Exception as e: + print(name + " 解析失败:" + repr(e) + ",请检查命名规范,比如auto_1_1=>auto_1 或 patch_1_1=>patch_1") + elif hash_now == hash_old: + convert_2_zip_file(src_file) \ No newline at end of file