Initial 智念AIGC platform
This commit is contained in:
38
lib/server/mock-image.ts
Normal file
38
lib/server/mock-image.ts
Normal file
@@ -0,0 +1,38 @@
|
||||
import { createHash } from "node:crypto";
|
||||
|
||||
export function createMockImageBuffer(input: {
|
||||
title: string;
|
||||
prompt?: string;
|
||||
capability: string;
|
||||
resolution?: string;
|
||||
}): Buffer {
|
||||
const seed = createHash("sha1").update(`${input.capability}:${input.prompt || ""}`).digest("hex");
|
||||
const colorA = `#${seed.slice(0, 6)}`;
|
||||
const colorB = `#${seed.slice(6, 12)}`;
|
||||
const colorC = `#${seed.slice(12, 18)}`;
|
||||
const prompt = escapeXml(shorten(input.prompt || input.title, 96));
|
||||
const subtitle = escapeXml(input.resolution ? `${input.capability} / ${input.resolution}` : input.capability);
|
||||
const svg = `<svg xmlns="http://www.w3.org/2000/svg" width="1536" height="1024" viewBox="0 0 1536 1024">
|
||||
<rect width="1536" height="1024" fill="#f8faf7"/>
|
||||
<rect x="88" y="88" width="1360" height="848" rx="20" fill="${colorA}" opacity="0.92"/>
|
||||
<path d="M88 782 C320 620 452 942 676 760 C915 565 1058 785 1448 530 L1448 936 L88 936 Z" fill="${colorB}" opacity="0.72"/>
|
||||
<path d="M90 230 C282 151 450 328 660 224 C870 120 1060 170 1446 104 L1446 366 C1080 455 880 326 682 426 C480 528 282 408 90 508 Z" fill="${colorC}" opacity="0.56"/>
|
||||
<circle cx="1218" cy="276" r="106" fill="#ffffff" opacity="0.78"/>
|
||||
<text x="144" y="720" font-family="Arial, 'PingFang SC', sans-serif" font-size="62" font-weight="700" fill="#ffffff">${prompt}</text>
|
||||
<text x="144" y="792" font-family="Arial, 'PingFang SC', sans-serif" font-size="30" fill="#ffffff" opacity="0.86">${subtitle}</text>
|
||||
<text x="144" y="856" font-family="Arial, 'PingFang SC', sans-serif" font-size="24" fill="#ffffff" opacity="0.72">Mock result: configure Volcengine credentials to call Jimeng Visual API.</text>
|
||||
</svg>`;
|
||||
return Buffer.from(svg);
|
||||
}
|
||||
|
||||
function shorten(value: string, max: number): string {
|
||||
return value.length > max ? `${value.slice(0, max - 1)}...` : value;
|
||||
}
|
||||
|
||||
function escapeXml(value: string): string {
|
||||
return value
|
||||
.replace(/&/g, "&")
|
||||
.replace(/</g, "<")
|
||||
.replace(/>/g, ">")
|
||||
.replace(/"/g, """);
|
||||
}
|
||||
Reference in New Issue
Block a user