Skip to content

@mai-kit/draw

@mai-kit/draw — 舞萌 DX 成绩海报 / Best 板 / 单曲卡 / 升分板绘制。

入口扁平:new Draw({ database })一种图一个方法(成对 PNG / SVG)。 末位共用 RenderOptionsscale / fonts / 页脚 / assetFallback)。 单曲卡只展示谱面成绩,不画玩家栏。

B50 海报

ts
const draw = new Draw({ database });
const png = await draw.poster(profile, bests, {
  scale: 1,
  footerLeft: "my-app",
});

Best 板(署名 + prober Bests;库内只切割不排序)

ts
const head = { name: profile.name, rating: profile.rating };
const opts = { scale: 1, footerLeft: "my-app" };
await draw.best15(head, bests, opts);
await draw.best35(head, bests, opts);
await draw.best50(head, bests, opts);

单曲卡

ts
const png = await draw.chart(scoreChart, { scale: 1 });

加分板(全曲候选,宿主侧 analysis)

ts
// 全曲 + 定数 + 真实 bests 地板;minRate 定目标评级(如 SSS+)
const candidates = rankBestsUpgradeCandidates(entries, {
  currentBests: bests,
  isNewSong,
  minRate: "sssp",
  limit: 10,
});
const png = await draw.upgrades({ candidates }, { scale: 1 });
  • 落盘:只返回 Uint8Array / 字符串,由宿主保存或上传

处理 PNG 结果

Node 落盘:

ts
import { writeFile } from "node:fs/promises";

const png = await draw.poster(profile, bests);
await writeFile("poster.png", png);

Web 预览:

ts
const png = await draw.poster(profile, bests);
const url = URL.createObjectURL(new Blob([png], { type: "image/png" }));
image.src = url;

成绩海报指南 · 包与职责

绘制接口

名称描述
Draw成绩海报绘制入口:构造时注入 database一种图一个方法(成对提供 PNG / SVG)。
AssetSource素材来源接口。只声明 draw 用到的 getAssetMaimaiDatabase(方法更多、 AssetType 更宽)可结构化直接传入,用户亦可自定义实现。
ChartTagdraw 聚合雷达图所需的最小社区标签结构
ChartTagSourcedraw 与 database 解耦所用的最小标签来源接口
DrawOptionsDraw 构造配置。
MetricItem个人数据网格一项
PlayerProfile玩家档案(展示用,prober PlayerProfile 的结构子集)。
PosterData完整 B50 海报绘制数据(仅 Draw.poster 需要整包)。 通常由 draw.poster(profile, bests) 内部经 buildPosterData 生成;也可自行组装后 draw.poster(data)
PosterSummaryB50 汇总数字(海报左栏用)。
RadarItem谱面倾向雷达一项(DXRating 社区标签)
RatingDistributionItem评级分布饼图一项
RenderOptions各出图方法共用的渲染选项(末位参数;均可省略)。
ScoreChart成绩卡片(展示用,prober Score 的结构子集)。
SongListSource曲目列表来源(可选)。与 ChartTagSource 常由同一 database 实现。 有则 Draw.poster / Best 板等方法 自动dx_max / level_value,调用方不必手算 map。
UpgradeBoardData加分推荐板数据。
UpgradeCandidate加分推荐列表中的一行。
AssetFallback封面 / 头像等素材解析失败时的策略。
DrawAssetTypedraw 实际需要的素材类型(@mai-kit/database AssetType 的子集,本地定义以解耦)
DrawSourceDraw 构造时的数据源:素材必选,标签与曲目列表按出图方法使用。
PosterDataSource玩家数据聚合来源:标签必选;曲目列表可选(有则注入物量/定数)。
buildPosterData将 prober 档案 + Best50 聚合成 PosterData(高级;多数场景直接 draw.poster)。

错误

名称描述
DrawError绘制层错误:字体加载、satori、resvg 或玩家数据聚合(如雷达标签不足)失败时抛出。
isDrawError类型守卫:是否为 DrawError

布局与格式化

名称描述
BestBoardLayoutbestBoardLayout 计算出的 Best 板网格与字号几何。 所有尺寸与字号数值的单位都是逻辑像素。
BestPage横屏 Best 板页种,对应 Draw.best15 / Draw.best35 / Draw.best50
BEST_HEIGHTBest 板逻辑画布高(与海报同为 1080)。
BEST_WIDTHBest 板逻辑画布宽(与海报同为 1920)。
CHART_CARD_HEIGHT单曲卡逻辑画布高(与 B50 同为 1080)。
CHART_CARD_WIDTH单曲卡逻辑画布宽(与 B50 同为 1920)。
POSTER_HEIGHT海报 JSX 布局与尺寸常量。
POSTER_WIDTH海报 JSX 布局与尺寸常量。
UPGRADES_BOARD_HEIGHT加分板逻辑画布高(与 B50 同为 1080)。
UPGRADES_BOARD_WIDTH加分板逻辑画布宽(与 B50 同为 1920)。
B50Poster海报 JSX 布局与尺寸常量。
BestBoardBest 板 JSX 布局、尺寸与网格几何。
bestBoardLayoutBest 板 JSX 布局、尺寸与网格几何。
ChartCardPoster单曲卡 / 升分板布局(高级)。
formatChartRating布局组件使用的成绩格式化函数。
formatDxScore布局组件使用的成绩格式化函数。
formatLevelConstant布局组件使用的成绩格式化函数。
UpgradesBoard加分推荐板 JSX(16:9,两列)。