feat: 移除图片适配模式功能
移除图片 fit 和 background 参数支持,简化图片渲染逻辑。系统恢复到直接使用 python-pptx 原生图片添加功能,图片将被拉伸到指定尺寸。 变更内容: - 移除 ImageElement 的 fit 和 background 字段 - 移除 metadata.dpi 配置 - 删除 utils/image_utils.py 图片处理工具模块 - 删除 validators/image_config.py 验证器 - 简化 PPTX 和 HTML 渲染器的图片处理逻辑 - HTML 渲染器使用硬编码 DPI=96(Web 标准) - 删除相关测试文件(单元测试、集成测试、e2e 测试) - 更新规格文档和用户文档 - 保留 Pillow 依赖用于未来可能的图片处理需求 影响: - 删除 11 个文件 - 修改 10 个文件 - 净减少 1558 行代码 - 所有 402 个测试通过 Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -10,28 +10,23 @@ from pptx.util import Inches, Pt
|
||||
from pptx.enum.text import PP_ALIGN
|
||||
from pptx.enum.shapes import MSO_SHAPE
|
||||
from pptx.dml.color import RGBColor
|
||||
from PIL import Image
|
||||
import tempfile
|
||||
|
||||
from core.elements import TextElement, ImageElement, ShapeElement, TableElement
|
||||
from loaders.yaml_loader import YAMLError
|
||||
from utils import hex_to_rgb
|
||||
from utils.image_utils import inches_to_pixels, apply_fit_mode
|
||||
|
||||
|
||||
class PptxGenerator:
|
||||
"""PPTX 生成器,封装 python-pptx 操作"""
|
||||
|
||||
def __init__(self, size='16:9', dpi=96):
|
||||
def __init__(self, size='16:9'):
|
||||
"""
|
||||
初始化 PPTX 生成器
|
||||
|
||||
Args:
|
||||
size: 幻灯片尺寸("16:9" 或 "4:3")
|
||||
dpi: DPI 配置,默认 96
|
||||
"""
|
||||
self.prs = PptxPresentation()
|
||||
self.dpi = dpi
|
||||
|
||||
# 设置幻灯片尺寸
|
||||
if size == '16:9':
|
||||
@@ -154,41 +149,8 @@ class PptxGenerator:
|
||||
# 获取位置和尺寸
|
||||
x, y, w, h = [Inches(v) for v in elem.box]
|
||||
|
||||
# 获取 fit 模式,默认为 stretch
|
||||
fit = elem.fit if elem.fit else 'stretch'
|
||||
|
||||
try:
|
||||
# stretch 模式:直接使用 python-pptx 的原生处理
|
||||
if fit == 'stretch':
|
||||
slide.shapes.add_picture(str(img_path), x, y, width=w, height=h)
|
||||
else:
|
||||
# 其他模式:使用 Pillow 处理图片
|
||||
# 打开图片
|
||||
with Image.open(img_path) as img:
|
||||
# 转换 box 尺寸为像素
|
||||
box_width_px = int(inches_to_pixels(elem.box[2], self.dpi))
|
||||
box_height_px = int(inches_to_pixels(elem.box[3], self.dpi))
|
||||
box_size = (box_width_px, box_height_px)
|
||||
|
||||
# 应用 fit 模式
|
||||
processed_img = apply_fit_mode(
|
||||
img, box_size, fit, elem.background
|
||||
)
|
||||
|
||||
# 保存处理后的图片到临时文件
|
||||
with tempfile.NamedTemporaryFile(suffix='.png', delete=False) as tmp:
|
||||
processed_img.save(tmp.name, 'PNG')
|
||||
tmp_path = tmp.name
|
||||
|
||||
try:
|
||||
# 添加处理后的图片到幻灯片
|
||||
slide.shapes.add_picture(tmp_path, x, y, width=w, height=h)
|
||||
finally:
|
||||
# 清理临时文件
|
||||
Path(tmp_path).unlink(missing_ok=True)
|
||||
|
||||
except Exception as e:
|
||||
raise YAMLError(f"添加图片失败: {img_path}: {str(e)}")
|
||||
# 直接添加图片到幻灯片
|
||||
slide.shapes.add_picture(str(img_path), x, y, width=w, height=h)
|
||||
|
||||
def _render_shape(self, slide, elem: ShapeElement):
|
||||
"""
|
||||
|
||||
Reference in New Issue
Block a user