增加了多图层分解

This commit is contained in:
jinye_huang 2025-07-27 17:33:16 +08:00
parent 9da9324484
commit 29551abc2e
2 changed files with 102 additions and 13 deletions

View File

@ -562,24 +562,40 @@ class VibrantTemplate(BaseTemplate):
psd.append(composite_layer)
logger.info("✓ 添加完美参考图层")
# === 第三步:按合成模式创建可编辑图层 ===
# === 第三步:提供丰富的可编辑图层 ===
# 图层2背景+毛玻璃的复合底层模拟canvas状态
base_composite = self._create_composite_image(main_image, gradient_start, theme_color)
base_composite_scaled = base_composite.resize(final_size, Image.LANCZOS)
base_layer = PixelLayer.frompil(base_composite_scaled, psd, "Background + Glass")
psd.append(base_layer)
logger.info("✓ 添加背景+毛玻璃复合图层")
# 图层2纯背景图层无任何效果
background_only = main_image.resize(final_size, Image.LANCZOS)
bg_layer = PixelLayer.frompil(background_only, psd, "Background Image")
psd.append(bg_layer)
logger.info("✓ 添加纯背景图层")
# 图层3纯文字图层在透明背景上模拟_render_texts的结果
# 图层3毛玻璃效果图层
glass_overlay = self._create_glass_overlay_layer(main_image, gradient_start, theme_color)
if glass_overlay:
glass_scaled = glass_overlay.resize(final_size, Image.LANCZOS)
glass_layer = PixelLayer.frompil(glass_scaled, psd, "Glass Overlay")
psd.append(glass_layer)
logger.info("✓ 添加毛玻璃效果图层")
# 图层4-9分离的文字图层
detailed_text_layers = self._create_detailed_text_layers(content, gradient_start, self.size)
for layer_name, layer_image in detailed_text_layers.items():
if layer_image:
text_scaled = layer_image.resize(final_size, Image.LANCZOS)
text_layer = PixelLayer.frompil(text_scaled, psd, layer_name)
psd.append(text_layer)
logger.info(f"✓ 添加文字图层: {layer_name}")
# 图层10整体文字图层备用
text_only_canvas = self._create_text_only_layer(content, gradient_start, self.size)
if text_only_canvas:
text_only_scaled = text_only_canvas.resize(final_size, Image.LANCZOS)
text_layer = PixelLayer.frompil(text_only_scaled, psd, "All Text Content")
psd.append(text_layer)
logger.info("✓ 添加纯文字图层")
all_text_layer = PixelLayer.frompil(text_only_scaled, psd, "All Text (Backup)")
psd.append(all_text_layer)
logger.info("✓ 添加整体文字备用图层")
logger.info(f"PSD包含{len(list(psd))}个图层,遵循原始合成逻辑")
logger.info(f"PSD包含{len(list(psd))}个图层1个参考层+{len(list(psd))-1}个编辑层")
# 保存PSD文件
psd.save(output_path)
@ -718,7 +734,80 @@ class VibrantTemplate(BaseTemplate):
logger.error(f"创建纯文字图层失败: {e}")
return None
def _create_detailed_text_layers(self, content: Dict[str, Any], gradient_start: int, canvas_size: tuple) -> Dict[str, Optional[Image.Image]]:
"""创建详细的分离文字图层,每个文字元素独立可编辑"""
layers = {}
try:
width, height = canvas_size
center_x = width // 2
left_margin, right_margin = self._calculate_content_margins(content, width, center_x)
# 1. 标题图层
title_canvas = Image.new('RGBA', canvas_size, (0, 0, 0, 0))
title_draw = ImageDraw.Draw(title_canvas)
title_y = gradient_start + 40
title_text = content.get("title", "默认标题")
title_target_width = int((right_margin - left_margin) * 0.98)
title_size, title_actual_width = self._calculate_optimal_font_size_enhanced(
title_text, title_target_width, max_size=140, min_size=40
)
try:
title_font = ImageFont.truetype(self.chinese_font_path, title_size)
except:
title_font = self.text_renderer._load_default_font(title_size)
text_w, text_h = self.text_renderer.get_text_size(title_text, title_font)
title_x = center_x - text_w // 2
self.text_renderer.draw_text_with_outline(title_draw, (title_x, title_y), title_text, title_font,
text_color=(255, 255, 255, 255), outline_color=(0, 30, 80, 200), outline_width=4)
layers["Title Text"] = title_canvas
# 2. 副标题图层
subtitle_canvas = Image.new('RGBA', canvas_size, (0, 0, 0, 0))
subtitle_draw = ImageDraw.Draw(subtitle_canvas)
subtitle_text = content.get("slogan", "")
if subtitle_text:
subtitle_target_width = int((right_margin - left_margin) * 0.95)
subtitle_size, subtitle_actual_width = self._calculate_optimal_font_size_enhanced(
subtitle_text, subtitle_target_width, max_size=75, min_size=20
)
try:
subtitle_font = ImageFont.truetype(self.chinese_font_path, subtitle_size)
except:
subtitle_font = self.text_renderer._load_default_font(subtitle_size)
sub_text_w, sub_text_h = self.text_renderer.get_text_size(subtitle_text, subtitle_font)
subtitle_x = center_x - sub_text_w // 2
subtitle_y = title_y + text_h + 30
self.text_renderer.draw_text_with_shadow(subtitle_draw, (subtitle_x, subtitle_y), subtitle_text, subtitle_font,
text_color=(255, 255, 255, 255), shadow_color=(0, 0, 0, 180), shadow_offset=(2, 2))
layers["Subtitle Text"] = subtitle_canvas
# 3. 页脚图层
footer_canvas = Image.new('RGBA', canvas_size, (0, 0, 0, 0))
footer_draw = ImageDraw.Draw(footer_canvas)
footer_y = height - 30
try:
footer_font = ImageFont.truetype(self.chinese_font_path, 18)
except:
footer_font = self.text_renderer._load_default_font(18)
if tag := content.get("tag"):
footer_draw.text((left_margin, footer_y), tag, font=footer_font, fill=(255, 255, 255))
if pagination := content.get("pagination"):
width_pg, _ = self.text_renderer.get_text_size(pagination, footer_font)
footer_draw.text((right_margin - width_pg, footer_y), pagination, font=footer_font, fill=(255, 255, 255))
layers["Footer"] = footer_canvas
except Exception as e:
logger.error(f"创建详细文字图层失败: {e}")
return {k: v for k, v in layers.items() if v is not None}
def _draw_text_with_outline_simple(self, draw: ImageDraw.Draw, position: Tuple[int, int],
text: str, font: ImageFont.FreeTypeFont,