使用场景
用户有大量图片文件,希望能按照图片中的某些文字对图片文件重命名,手工操作麻烦而且容易出错。具体场景:用户有工程现场照片,订单,简历等图片文件,期望按照图片中文字对文件批量重命名、改名,后期对文件进行快速检索 ,不用每个文件打开看。
工具处理
软件名称:JDX图片识别、JDX同心软件
软件地址:
https://pan.baidu.com/s/1CFvutLeRh2LWqzuLM2WXRQ?pwd=k8qu
https://share.weiyun.com/pq0GbDGI
第一步:选择要改名图片文件
选择待改名的图片文件,可以按照文件夹选择,也可以按部分文件选择。
导入图片文件后,软件主界面如下。可以查看图片列表,预览图片,图片编辑等。
第二步:设置要识别区域(可设置多个)
在识别范围窗体里,添加需要识别的范围(按住鼠标拉框绘制识别区域),通过同步范围设置把当前图片的识别区域同步到其他图片上。不同识别区域就代表要识别的范围以及文字内容。设置的识别范围模板也可保存,便于后续加载到软件重复使用。
第三步:对自定义范围进行批量识别文字
执行批量识别文字,识别结果淡绿色,右侧识别结果文字,可校核与编辑。识别结果有误的,右侧结果列表可用替换、编辑、提取等功能调整识别结果。
第四步:选择自定义区域,对图片改名
选择指定的识别区域,根据识别结果最终改名。文件改名预览窗体里,可以校核与编辑新的文件名,校核无误之后,确定即可。
至此,通过以上步骤就能对图片按照指定识别区域文字,批量文件改名。
Python脚本
import os import re import shutil from pathlib import Path import pytesseract from PIL import Image # -------------------------- 配置项 -------------------------- # Tesseract OCR引擎路径(Windows用户必须修改,mac/Linux一般无需修改) pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe' # 待处理图片文件夹路径(修改为你的实际路径) IMAGE_FOLDER = './images' # 重命名规则配置 # 1. 提取文字的最大长度(避免文件名过长) MAX_TEXT_LENGTH = 50 # 2. 优先匹配的关键字(可选):识别到这些关键字时优先用其附近文字命名 PRIORITY_KEYWORDS = ['产品', '报告', '编号', '名称', '日期'] # 3. 重命名后缀(可选,用于区分原文件) RENAME_SUFFIX = '_识别重命名' # 4. 无法识别文字时的默认前缀 UNRECOGNIZED_PREFIX = '未识别_' # ------------------------------------------------------------ def preprocess_image(image_path): """ 图片预处理:转为灰度图、提升对比度,提高OCR识别准确率 :param image_path: 图片路径 :return: 预处理后的PIL Image对象 """ try: img = Image.open(image_path) # 转为灰度图 img = img.convert('L') # 简单的对比度增强(可选,根据实际情况调整) threshold = 128 img = img.point(lambda x: 255 if x > threshold else 0) return img except Exception as e: print(f"图片预处理失败 {image_path}:{str(e)[:50]}") return None def extract_text_from_image(image_path): """ 从图片中提取文字(带预处理) :param image_path: 图片文件路径 :return: 提取到的纯文本 """ # 图片预处理 img = preprocess_image(image_path) if img is None: return "" try: # 执行OCR识别(支持中英双语) text = pytesseract.image_to_string(img, lang='chi_sim+eng') # 清理多余的空白字符 text = re.sub(r'\s+', ' ', text).strip() return text except Exception as e: print(f"OCR识别失败 {image_path}:{str(e)[:50]}") return "" def clean_filename(filename): """ 清理文件名中的非法字符(Windows/macOS/Linux通用) :param filename: 原始文件名 :return: 合法的文件名 """ # 移除系统非法字符 illegal_chars = r'[\/:*?"<>|]' clean_name = re.sub(illegal_chars, '_', filename) # 移除多余空格和换行 clean_name = re.sub(r'\s+', ' ', clean_name).strip() # 避免空文件名 return clean_name if clean_name else '默认名称' def generate_new_filename(image_text, original_name): """ 根据提取的文字生成新文件名 :param image_text: 识别到的图片文字 :param original_name: 原文件名(含后缀) :return: 新的合法文件名 """ original_path = Path(original_name) original_stem = original_path.stem # 原文件名(无后缀) original_suffix = original_path.suffix.lower() # 图片后缀(如.png) # 1. 无识别文字的情况 if not image_text: unique_id = os.urandom(4).hex() # 生成随机ID避免重名 return f"{UNRECOGNIZED_PREFIX}{original_stem}_{unique_id}{original_suffix}" # 2. 优先匹配关键字 for keyword in PRIORITY_KEYWORDS: if keyword in image_text: # 提取关键字附近的文字片段(前后各20个字符) keyword_idx = image_text.find(keyword) start_idx = max(0, keyword_idx - 20) end_idx = min(len(image_text), keyword_idx + 20) text_fragment = image_text[start_idx:end_idx] # 清理并截断长度 clean_fragment = clean_filename(text_fragment)[:MAX_TEXT_LENGTH] return f"{clean_fragment}{RENAME_SUFFIX}{original_suffix}" # 3. 无关键字时,提取开头文字作为文件名 clean_text = clean_filename(image_text)[:MAX_TEXT_LENGTH] return f"{clean_text}{RENAME_SUFFIX}{original_suffix}" def batch_rename_images(): """ 批量重命名图片主函数 """ # 检查目标文件夹 img_folder = Path(IMAGE_FOLDER) if not img_folder.exists(): print(f"错误:文件夹 {IMAGE_FOLDER} 不存在!") return # 支持的图片格式 image_extensions = ('.png', '.jpg', '.jpeg', '.bmp', '.gif', '.tiff', '.webp') # 收集所有图片文件 image_files = [ f for f in img_folder.iterdir() if f.is_file() and f.suffix.lower() in image_extensions ] if not image_files: print(f"文件夹 {IMAGE_FOLDER} 中未找到图片文件!") return print(f"共找到 {len(image_files)} 张图片,开始批量处理...\n") # 统计处理结果 success_count = 0 fail_count = 0 # 遍历处理每张图片 for img_file in image_files: try: print(f"正在处理:{img_file.name}") # 1. 提取图片文字 img_text = extract_text_from_image(str(img_file)) preview_text = img_text[:80] + "..." if len(img_text) > 80 else img_text print(f"识别到的文字:{preview_text if img_text else '无'}") # 2. 生成新文件名 new_name = generate_new_filename(img_text, img_file.name) new_path = img_folder / new_name # 3. 处理重名问题(添加数字后缀) counter = 1 while new_path.exists(): new_stem = f"{Path(new_name).stem}_{counter}" new_name = f"{new_stem}{Path(new_name).suffix}" new_path = img_folder / new_name counter += 1 # 4. 执行重命名 os.rename(str(img_file), str(new_path)) print(f"重命名成功:{new_name}\n") success_count += 1 except Exception as e: print(f"处理失败 {img_file.name}:{str(e)}\n") fail_count += 1 # 输出最终统计结果 print("="*60) print(f"批量处理完成!") print(f"✅ 成功:{success_count} 张") print(f"❌ 失败:{fail_count} 张") print(f"📁 所有文件已保存在:{img_folder.absolute()}") if __name__ == "__main__": print("===== JDX同心软件 & JDX图片识别 =====") print("===== 图片文字识别 & 批量重命名脚本 =====") batch_rename_images() print("\n脚本执行结束!")