From ba22befda1b7554f560d4986dda0efecc0ec9bff Mon Sep 17 00:00:00 2001 From: jinye_huang Date: Sun, 27 Apr 2025 16:13:28 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=8C=E6=AD=A5=E4=BA=86=E9=80=89=E5=9B=BE?= =?UTF-8?q?=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../simple_collage.cpython-312.pyc | Bin 39988 -> 35060 bytes core/simple_collage.py | 245 ++++++------------ .../tweet_generator.cpython-312.pyc | Bin 34533 -> 34533 bytes 3 files changed, 73 insertions(+), 172 deletions(-) diff --git a/core/__pycache__/simple_collage.cpython-312.pyc b/core/__pycache__/simple_collage.cpython-312.pyc index f3a325bfdb223ca6cf02308fdaf1dffd1011ff93..ad0f3c3b6cb038988e282691e7efef8db9a6498e 100644 GIT binary patch delta 8550 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 LqCAl=M;8Ad4C@B` delta 12666 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 l`g&}Me0c8_?>?2df+VeXwsN2J 1: - keywords.append(part) - - # 尝试匹配更短的语义单元(例如中文的2-3个字的词语) - for i in range(len(target_name) - 1): - keyword = target_name[i:i+2] # 提取2个字符 - if len(keyword) == 2 and all('\u4e00' <= c <= '\u9fff' for c in keyword): - keywords.append(keyword) - - logging.info(f"用于目录模糊匹配的关键词: {keywords}") - - # 3. 对每个目录进行评分 - dir_scores = {} - for directory in all_dirs: - score = 0 - dir_lower = directory.lower() - # 为每个匹配的关键词增加分数 - for keyword in keywords: - if keyword.lower() in dir_lower: - score += 1 - - # 如果得分大于0(至少匹配一个关键词),记录该目录 - if score > 0: - dir_scores[directory] = score - - # 4. 选择得分最高的目录 - if dir_scores: - best_match = max(dir_scores.items(), key=lambda x: x[1]) - found_dir = best_match[0] - score = best_match[1] - logging.info(f"模糊匹配成功!匹配目录: {found_dir},匹配分数: {score}") - return os.path.join(base_dir, found_dir), score - else: - logging.warning(f"模糊匹配未找到任何包含关键词的目录") - return None, 0 - - except Exception as e: - logging.exception(f"目录模糊匹配过程中出错: {e}") - return None, 0 - def create_collage_with_style(self, input_dir, style=None, target_size=None): - """ - 创建特定样式的照片拼贴。 - 如果input_dir不存在,会尝试进行模糊匹配。 + """创建指定样式的拼接画布 - Args: - input_dir: 包含图片的目录路径或目标对象名称 - style: 拼贴画样式,例如"grid_2x2", "overlap"等 - target_size: 拼贴画目标尺寸,例如(900, 1200) + 参数: + input_dir: 输入图片目录路径 + style: 拼贴样式,如不指定则随机选择 + target_size: 目标尺寸,默认为(900, 1200) - Returns: - tuple: (PIL.Image 拼贴画对象, 使用的图片文件列表) + 返回: + tuple: (拼贴图, 选择的图片名称列表),如果创建失败则返回(None, []) """ + logging.info(f"--- Starting Collage Creation for Directory: {input_dir} ---") # Start Log try: - # 使用默认样式如果未指定 - if style is None: - if self.collage_style is None: - style = "grid_2x2" - else: - style = self.collage_style - logging.info(f"Using collage style: {style}") - - # 使用默认尺寸如果未指定 + # 设置默认尺寸为3:4比例 if target_size is None: - target_size = (900, 1200) # 默认尺寸 + target_size = (900, 1200) # 3:4比例 + + # 如果没有指定样式,随机选择一种 + if style is None or style not in self.collage_styles: + style = random.choice(self.collage_styles) logging.info(f"Using collage style: {style} with target size: {target_size}") - # 检查输入目录是否存在 - if not os.path.exists(input_dir) or not os.path.isdir(input_dir): - # 尝试从输入路径获取基础目录和对象名称 - base_dir = os.path.dirname(input_dir) - object_name = os.path.basename(input_dir) - - # 如果基础目录存在,尝试模糊匹配 - if os.path.exists(base_dir) and os.path.isdir(base_dir): - matched_dir, score = self.find_directory_fuzzy_match(base_dir, object_name) - if matched_dir and score > 0: - logging.info(f"使用模糊匹配的图片目录: {matched_dir}") - input_dir = matched_dir - else: - logging.error(f"无法找到匹配的图片目录: {input_dir}") - return None, [] - else: - logging.error(f"输入目录不存在且无法进行模糊匹配: {input_dir}") - return None, [] - + # 检查目录是否存在 + if not os.path.exists(input_dir): + logging.error(f"Input directory does not exist: {input_dir}") + return None, [] + # 支持的图片格式 image_extensions = ('.jpg', '.jpeg', '.png', '.bmp') @@ -781,82 +690,74 @@ class ImageCollageCreator: def process_directory(directory_path, style=None, target_size=(900, 1200), output_count=1): """ - 处理目录中的图片并创建指定数量的拼贴图 + 处理指定目录中的图片,创建指定数量的拼贴图。 - 如果给定的目录不存在,会尝试进行模糊匹配。 - - Args: - directory_path: 图片目录路径或目标对象名称 - style: 拼贴画样式,例如"grid_2x2",如果为None则随机选择 - target_size: 拼贴画尺寸,默认为(900, 1200) - output_count: 要生成的拼贴画数量 - - Returns: - list: 成功创建的拼贴图列表 (PIL Image对象) + 参数: + directory_path: 包含图片的目录路径 + target_size: 拼贴图目标尺寸,默认为 (900, 1200) + output_count: 需要生成的拼贴图数量,默认为 1 + + 返回: + tuple: (拼贴图列表, 使用的图片名称列表的列表),如果生成失败,返回 ([], []) + 拼贴图列表是PIL.Image对象列表 + 图片名称列表是一个列表的列表,每个子列表包含一张拼贴图使用的图片文件名 """ logging.info(f"处理目录中的图片并创建 {output_count} 个拼贴图: {directory_path}") - # 创建拼贴图实例 + # 创建 ImageCollageCreator 实例 collage_creator = ImageCollageCreator() + collage_images = [] + used_image_names = [] # 存储每个拼贴图使用的图片文件名 - # 如果指定了样式,设置样式 - if style: - collage_creator.set_collage_style(style) - # 检查目录是否存在 - if not os.path.exists(directory_path) or not os.path.isdir(directory_path): - # 尝试从路径获取基础目录和对象名称 - base_dir = os.path.dirname(directory_path) - object_name = os.path.basename(directory_path) + if not os.path.exists(directory_path): + logging.error(f"目录不存在: {directory_path}") + return [], [] - # 如果基础目录存在,尝试模糊匹配 - if os.path.exists(base_dir) and os.path.isdir(base_dir): - matched_dir, score = collage_creator.find_directory_fuzzy_match(base_dir, object_name) - if matched_dir and score > 0: - logging.info(f"使用模糊匹配的图片目录: {matched_dir}") - directory_path = matched_dir - else: - logging.error(f"无法找到匹配的图片目录: {directory_path}") - return [] - else: - logging.error(f"输入目录不存在且无法进行模糊匹配: {directory_path}") - return [] + # 支持的图片格式 + image_extensions = ('.jpg', '.jpeg', '.png', '.bmp') - # 获取有效图片文件列表 - image_extensions = ('.jpg', '.jpeg', '.png', '.webp', '.bmp', '.gif') + # 获取目录中的所有有效图片文件 try: all_files = os.listdir(directory_path) - image_files = [f for f in all_files - if f.lower().endswith(image_extensions) and os.path.isfile(os.path.join(directory_path, f))] - logging.info(f"目录中找到 {len(image_files)} 个有效图片文件") - - if not image_files: - logging.warning(f"目录中未找到有效图片: {directory_path}") - return [] + all_images_names = [f for f in all_files + if f.lower().endswith(image_extensions) and os.path.isfile(os.path.join(directory_path, f))] + + if not all_images_names: + logging.error(f"目录中没有有效的图片文件: {directory_path}") + return [], [] + + logging.info(f"目录中找到 {len(all_images_names)} 个有效图片文件") except Exception as e: - logging.exception(f"无法读取目录 {directory_path}: {e}") - return [] + logging.exception(f"列出目录内容时出错: {e}") + return [], [] - # 创建指定数量的拼贴图 - created_collages = [] + # 尝试创建请求数量的拼贴图 for i in range(output_count): - # 如果指定了样式,则使用指定样式;否则让create_collage_with_style自行选择 - if style: - collage, used_images = collage_creator.create_collage_with_style(directory_path, style=style, target_size=target_size) - else: - # 随机选择一种样式 - available_styles = collage_creator.collage_styles - random_style = random.choice(available_styles) - collage, used_images = collage_creator.create_collage_with_style(directory_path, style=random_style, target_size=target_size) + try: + # 创建拼贴图,使用指定样式 + collage, selected_images_names = collage_creator.create_collage_with_style( + directory_path, + style=style, + target_size=target_size + ) - if collage: - created_collages.append(collage) - logging.info(f"成功创建拼贴图 {len(created_collages)}/{output_count}") - else: - logging.warning(f"创建拼贴图 {i+1}/{output_count} 失败") - - logging.info(f"已处理目录 {directory_path},成功创建 {len(created_collages)}/{output_count} 个拼贴图") - return created_collages + if collage: + collage_images.append(collage) + + # 从输出日志中解析出使用的图片名称 + # 由于我们修改了create_collage_with_style来打印选择的图片 + # 可能需要进一步修改为直接返回选择的图片 + used_image_names.append(selected_images_names) + + logging.info(f"成功创建拼贴图 {i+1}/{output_count}") + else: + logging.error(f"无法创建拼贴图 {i+1}/{output_count}") + except Exception as e: + logging.exception(f"创建拼贴图 {i+1}/{output_count} 时发生异常: {e}") + + logging.info(f"已处理目录 {directory_path},成功创建 {len(collage_images)}/{output_count} 个拼贴图") + return collage_images, used_image_names def find_main_subject(image): # ... (keep the existing implementation) ... diff --git a/utils/__pycache__/tweet_generator.cpython-312.pyc b/utils/__pycache__/tweet_generator.cpython-312.pyc index 03cf21d5037db0e1dc03d75d48060300187537b4..116e488886a2159c40e541162ca62cb8d3ff5708 100644 GIT binary patch delta 21 bcmaFb%k;FDiR&~kFBbz4I6U3Rb-N7!P#Fg! delta 21 bcmaFb%k;FDiR&~kFBbz4#9Z9Sb-N7!P+bQr