2 Commits

Author SHA1 Message Date
8090d679b4 Merge remote-tracking branch 'refs/remotes/origin/master' 2026-04-09 14:58:43 +08:00
4965d6c40e fix: 分享卡片走兜底图优化 2026-04-09 14:58:02 +08:00
2 changed files with 20 additions and 12 deletions

View File

@@ -138,11 +138,8 @@ export default forwardRef(({ id, from, detail, userInfo }, ref) => {
}
}
useShareAppMessage(async (res) => {
await changeMessageType();
await ensureUserInfo();
const url = await generateShareImageUrl();
// console.log(res, "res");
useShareAppMessage(async () => {
const url = shareImageUrl || (await generateShareImageUrl());
return {
title: detail.title,
imageUrl: url,

View File

@@ -115,16 +115,25 @@ function with_cache_bust(url: string): string {
// 工具函数 - OffscreenCanvas 下加载图片(使用 offscreen.createImage
const loadImage = (src: string): Promise<any> => {
return new Promise((resolve, reject) => {
let timer: ReturnType<typeof setTimeout> | null = null
try {
const off = runtime.offscreen
if (!off || typeof off.createImage !== 'function') {
throw new Error('OffscreenCanvas 未初始化或不支持 createImage')
}
const img = off.createImage()
img.onload = () => resolve(img)
img.onerror = reject
timer = setTimeout(() => reject(new Error(`图片加载超时: ${src}`)), 8000)
img.onload = () => {
if (timer) clearTimeout(timer)
resolve(img)
}
img.onerror = (e: any) => {
if (timer) clearTimeout(timer)
reject(e)
}
img.src = with_cache_bust(src)
} catch (e) {
if (timer) clearTimeout(timer)
reject(e)
}
})
@@ -413,7 +422,7 @@ const drawShareCard = async (ctx: any, data: ShareCardData, offscreen: any): Pro
ctx.restore()
} catch (error) {
// 如果头像加载失败,绘制默认头像
ctx.setFillStyle('#CCCCCC')
ctx.fillStyle = '#CCCCCC'
ctx.beginPath()
ctx.arc(avatarX + avatarSize / 2, avatarY + avatarSize / 2, avatarSize / 2, 0, 2 * Math.PI)
ctx.fill()
@@ -594,10 +603,12 @@ export async function generateShareImage(data: ShareCardData): Promise<string> {
// 记录到 runtime供 loadImage 使用)
runtime.offscreen = offscreen
isDrawing = true
try {
const imagePath = await drawShareCard(ctx, data, offscreen)
isDrawing = false
return imagePath
} finally {
isDrawing = false
}
}
export default generateShareImage