From 9ca07ff57186725ca28aa2558a6d0af39c956ac5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E9=B1=BC=E5=BC=80=E5=8F=91?= Date: Tue, 26 May 2026 18:54:42 +0800 Subject: [PATCH] =?UTF-8?q?fix(cover):=20=E5=B0=81=E9=9D=A2=E4=B8=BB?= =?UTF-8?q?=E5=89=AF=E6=A0=87=E9=A2=98=E4=BD=8D=E7=BD=AE=E5=9B=BA=E5=AE=9A?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 主标题固定 top=200,副标题固定 top=380,不再根据封面形象高度和文字行数动态计算 - 清理未使用的 avatarTop、hasAvatar、mainTitleHeight、subtitleHeight 变量 - 补全 renderCover useCallback 依赖数组(增加 loadAvatarImage) --- tauri-app/src/hooks/useCoverFabric.ts | 37 ++++++--------------------- 1 file changed, 8 insertions(+), 29 deletions(-) diff --git a/tauri-app/src/hooks/useCoverFabric.ts b/tauri-app/src/hooks/useCoverFabric.ts index dfc29cf..f4f0982 100644 --- a/tauri-app/src/hooks/useCoverFabric.ts +++ b/tauri-app/src/hooks/useCoverFabric.ts @@ -69,7 +69,7 @@ const TEMPLATES: Record = { mainTitle: { fontSize: 144, fill: '#FFD700', - top: 480, // 1920 * 0.25 + top: 200, fontWeight: 'bold', shadow: new Shadow({ color: 'rgba(0,0,0,0.9)', @@ -81,7 +81,7 @@ const TEMPLATES: Record = { subtitle: { fontSize: 72, fill: '#FF8C00', - top: 1575, // 约 82% 处 + top: 380, shadow: new Shadow({ color: 'rgba(0,0,0,0.85)', blur: 12, @@ -291,22 +291,17 @@ export function useCoverFabric() { } // 2. 封面形象(叠加在背景之上) - let avatarTop = CANVAS_HEIGHT; - let hasAvatar = false; if (config.avatarImage) { try { - const scaledHeight = await loadAvatarImage(canvas, config.avatarImage); - avatarTop = CANVAS_HEIGHT - scaledHeight; - hasAvatar = true; + await loadAvatarImage(canvas, config.avatarImage); } catch (err) { - // 封面形象加载失败不影响主流程,但文字位置需要回退到固定布局 console.warn('[useCoverFabric] 封面形象加载失败:', err); } } const template = TEMPLATES[config.template]; - // 预计算主副标题行数和高度,用于动态定位 + // 预计算主副标题行数 const mainTitleLines = config.mainTitle.trim() ? wrapTextByWidth(config.mainTitle.trim(), CANVAS_WIDTH - 120, template.mainTitle.fontSize).slice(0, 2) : []; @@ -316,26 +311,10 @@ export function useCoverFabric() { const mainTitleLineHeight = template.mainTitle.fontSize * 1.2; const subtitleLineHeight = template.subtitle.fontSize * 1.5; - const mainTitleHeight = mainTitleLines.length * mainTitleLineHeight; - const subtitleHeight = subtitleLines.length * subtitleLineHeight; - // 计算文字位置 - let subtitleTop: number; - let mainTitleTop: number; - - if (hasAvatar) { - // 有封面形象:从人物头顶往上堆叠 - const gapAvatarToSub = 50; // 人物与副标题间距 - const gapSubToMain = 24; // 副标题与主标题间距 - const subtitleBottom = avatarTop - gapAvatarToSub; - subtitleTop = subtitleBottom - subtitleHeight; - const mainTitleBottom = subtitleTop - gapSubToMain; - mainTitleTop = mainTitleBottom - mainTitleHeight; - } else { - // 无封面形象:使用模板固定位置(避免文字堆在画布底部) - mainTitleTop = template.mainTitle.top; - subtitleTop = template.subtitle.top; - } + // 文字位置固定,不再根据封面形象高度和文字行数动态计算 + const mainTitleTop = template.mainTitle.top; + const subtitleTop = template.subtitle.top; // 3. 主标题(放在人物上方最外侧) if (mainTitleLines.length > 0) { @@ -384,7 +363,7 @@ export function useCoverFabric() { canvas.renderAll(); }, - [loadBackground] + [loadBackground, loadAvatarImage] ); // 导出 PNG