如何批量翻译图片?附Python代码报错修复求助
批量图片翻译的免费方案
如果要批量处理200余张漫画类图片,可从以下免费途径入手:
- 开源脚本组合:用Tesseract OCR做批量文字识别,搭配DeepL免费API、百度翻译免费API完成翻译,自行编写简单脚本即可实现全流程自动化,适合有编程基础的用户。
- 桌面工具:
- 天若OCR:支持批量导入图片识别文字,内置翻译功能,可直接导出结果,免费版的批量处理能力足以应对200张图片的需求。
- 部分本地OCR工具支持命令行调用,可写批处理脚本循环处理文件夹内所有图片。
- 在线平台:部分正规免费在线OCR网站支持批量上传几十到上百张图片,识别完成后可批量翻译并导出文本,注意避免上传敏感内容。
Python代码修复方案
原代码存在多处关键问题,以下是修复后的版本及问题说明:
问题分析
- 缺少
os模块导入,代码中多处用到os相关方法但未声明导入。 - Google Cloud凭证配置错误:
GOOGLE_APPLICATION_CREDENTIALS需要的是服务账号JSON密钥文件的路径,而非API Key,API Key无法用于Vision和Translate客户端的身份验证。 - 图片处理逻辑错误:原代码仅生成空白图片保存,未将翻译后的文字叠加到原图上,完全不符合漫画翻译的需求。
- 未处理Vision API的响应错误,可能导致静默失败。
修复后的代码
import os from google.cloud import vision from google.cloud import translate_v2 as translate from PIL import Image, ImageDraw, ImageFont # 设置Google Cloud服务账号JSON密钥文件路径 os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = 'path/to/your/service-account-key.json' # 初始化客户端 vision_client = vision.ImageAnnotatorClient() translate_client = translate.Client() def detect_and_translate_text(image_path, target_language='zh-TW'): with open(image_path, 'rb') as image_file: content = image_file.read() image = vision.Image(content=content) response = vision_client.text_detection(image=image, image_context={"language_hints": ["ja"]}) # 处理API错误 if response.error.message: raise Exception(f"Vision API Error: {response.error.message}") texts = response.text_annotations if not texts: return None, [] # 提取所有文本块的内容和边界框(第一个是全文,后面是单个文本块) detected_text = texts[0].description text_boxes = [text.bounding_poly for text in texts[1:]] # 翻译文本 translation = translate_client.translate(detected_text, target_language=target_language) translated_lines = translation['translatedText'].split('\n') return translated_lines, text_boxes def translate_and_save_image(input_folder, output_folder, target_language='zh-TW', font_path='path/to/your/font.ttf'): if not os.path.exists(output_folder): os.makedirs(output_folder) # 加载字体,根据需要调整大小 try: font = ImageFont.truetype(font_path, 20) except: # fallback到默认字体 font = ImageFont.load_default() for filename in os.listdir(input_folder): if filename.lower().endswith(('.jpg', '.jpeg', '.png')): input_path = os.path.join(input_folder, filename) output_path = os.path.join(output_folder, filename) try: translated_lines, text_boxes = detect_and_translate_text(input_path, target_language) if translated_lines: # 打开原图 img = Image.open(input_path).convert('RGB') draw = ImageDraw.Draw(img) # 用白色覆盖原文本区域,然后绘制翻译后的文字 for box in text_boxes: # 获取边界框坐标 vertices = box.vertices x0, y0 = vertices[0].x, vertices[0].y x1, y1 = vertices[2].x, vertices[2].y # 绘制白色矩形覆盖原文字 draw.rectangle([(x0, y0), (x1, y1)], fill='white') # 绘制翻译后的文字(基础版本,可根据漫画排版优化文本块对应关系) y_offset = 50 for line in translated_lines: draw.text((50, y_offset), line, font=font, fill='black') y_offset += 30 img.save(output_path) print(f'处理完成: {filename}') else: print(f'未检测到文字: {filename}') except Exception as e: print(f'处理{filename}出错: {str(e)}') # 设置输入输出文件夹(Windows路径用单斜杠或双反斜杠) input_folder = 'C:/input_folder' output_folder = 'C:/output_folder' # 执行批量处理(替换字体路径为本地中文字体路径,比如微软雅黑) translate_and_save_image(input_folder, output_folder, font_path='C:/Windows/Fonts/msyh.ttc')
额外说明
- 若没有Google Cloud付费额度,建议替换为免费服务:用Tesseract OCR替代Google Vision,用DeepL免费API或百度翻译免费API替代Google Translate,避免产生费用。
- 漫画翻译的文字对齐需要更精细的处理,上述代码为基础版本,可根据实际排版优化文本块的位置、字体大小等参数。
内容的提问来源于stack exchange,提问作者shuangjack
相关产品推荐
相关产品推荐

