@ai-game-assets/dev 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/asset-store.d.ts +33 -0
- package/dist/asset-store.d.ts.map +1 -0
- package/dist/asset-store.js +235 -0
- package/dist/asset-store.js.map +1 -0
- package/dist/audio-provider.d.ts +27 -0
- package/dist/audio-provider.d.ts.map +1 -0
- package/dist/audio-provider.js +290 -0
- package/dist/audio-provider.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/internal.d.ts +4 -0
- package/dist/internal.d.ts.map +1 -0
- package/dist/internal.js +2 -0
- package/dist/internal.js.map +1 -0
- package/dist/provider-image-processing.d.ts +83 -0
- package/dist/provider-image-processing.d.ts.map +1 -0
- package/dist/provider-image-processing.js +503 -0
- package/dist/provider-image-processing.js.map +1 -0
- package/dist/provider.d.ts +43 -0
- package/dist/provider.d.ts.map +1 -0
- package/dist/provider.js +435 -0
- package/dist/provider.js.map +1 -0
- package/dist/server.d.ts +21 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +450 -0
- package/dist/server.js.map +1 -0
- package/package.json +36 -0
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { addVersion, assertManifest, createAiAssetVersion } from "@ai-game-assets/core";
|
|
2
|
+
export type { AiAssetDefinition, AiAssetManifest, AiAssetStyleGuide, AiAssetVersion } from "@ai-game-assets/core";
|
|
3
|
+
export type { GeneratedAssetOption } from "./provider.js";
|
|
4
|
+
//# sourceMappingURL=internal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"internal.d.ts","sourceRoot":"","sources":["../src/internal.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,cAAc,EACd,oBAAoB,EACrB,MAAM,sBAAsB,CAAC;AAE9B,YAAY,EACV,iBAAiB,EACjB,eAAe,EACf,iBAAiB,EACjB,cAAc,EACf,MAAM,sBAAsB,CAAC;AAE9B,YAAY,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC"}
|
package/dist/internal.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"internal.js","sourceRoot":"","sources":["../src/internal.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,cAAc,EACd,oBAAoB,EACrB,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import type { AiAssetDimensions, AiAssetGenerationSettings } from "@ai-game-assets/core";
|
|
2
|
+
import { PNG } from "pngjs";
|
|
3
|
+
import type { GenerateAssetReference, GenerateAssetRequest, OpenAiImageProviderOptions } from "./provider.js";
|
|
4
|
+
export type RgbColor = {
|
|
5
|
+
red: number;
|
|
6
|
+
green: number;
|
|
7
|
+
blue: number;
|
|
8
|
+
};
|
|
9
|
+
export declare function selectChromaKey(request: GenerateAssetRequest): RgbColor;
|
|
10
|
+
export declare function referenceLockPromptLines(references: GenerateAssetReference[]): string[];
|
|
11
|
+
export declare function referenceColorSamples(reference: GenerateAssetReference): RgbColor[];
|
|
12
|
+
type ReferenceImageAnalysis = {
|
|
13
|
+
dominantColors: string[];
|
|
14
|
+
saturatedColors: string[];
|
|
15
|
+
brightSaturatedColors: string[];
|
|
16
|
+
brightSaturatedCoveragePercent: string;
|
|
17
|
+
hasLargeDarkRegion: boolean;
|
|
18
|
+
hasLargeSaturatedRegion: boolean;
|
|
19
|
+
};
|
|
20
|
+
export declare function analyzeReferenceImage(reference: GenerateAssetReference): ReferenceImageAnalysis | undefined;
|
|
21
|
+
type ColorBin = {
|
|
22
|
+
count: number;
|
|
23
|
+
redTotal: number;
|
|
24
|
+
greenTotal: number;
|
|
25
|
+
blueTotal: number;
|
|
26
|
+
};
|
|
27
|
+
export declare function addColorBin(bins: Map<string, ColorBin>, red: number, green: number, blue: number): void;
|
|
28
|
+
export declare function topColorBins(bins: Map<string, ColorBin>, count: number): string[];
|
|
29
|
+
export declare function topColorBinValues(bins: Map<string, ColorBin>, count: number): RgbColor[];
|
|
30
|
+
export declare function quantizeColor(value: number): number;
|
|
31
|
+
export declare function isChromaRgb(red: number, green: number, blue: number): boolean;
|
|
32
|
+
export declare function isBrightSaturatedColor(red: number, green: number, blue: number): boolean;
|
|
33
|
+
export declare function relativeLuminance(red: number, green: number, blue: number): number;
|
|
34
|
+
export declare function colorName(red: number, green: number, blue: number): string;
|
|
35
|
+
export declare function colorDistance(left: RgbColor, right: RgbColor): number;
|
|
36
|
+
export declare function hexColor(color: RgbColor): string;
|
|
37
|
+
export declare function rgbColor(color: RgbColor): string;
|
|
38
|
+
export declare function variationDirectionPromptLine(index: number): string;
|
|
39
|
+
export declare function shouldRequestRgbaPng(request: GenerateAssetRequest, context: {
|
|
40
|
+
prompt: string;
|
|
41
|
+
model: string;
|
|
42
|
+
outputFormat: "png" | "webp" | "jpeg";
|
|
43
|
+
requestedBackground: AiAssetGenerationSettings["background"];
|
|
44
|
+
}): boolean;
|
|
45
|
+
export declare function resolveRequestedBackground(request: GenerateAssetRequest, options: OpenAiImageProviderOptions): AiAssetGenerationSettings["background"];
|
|
46
|
+
export declare function shouldPostprocessTransparency(request: GenerateAssetRequest, context: {
|
|
47
|
+
prompt: string;
|
|
48
|
+
model: string;
|
|
49
|
+
outputFormat: "png" | "webp" | "jpeg";
|
|
50
|
+
requestedBackground: AiAssetGenerationSettings["background"];
|
|
51
|
+
}): boolean;
|
|
52
|
+
export declare function removeChromaBackground(image: Uint8Array, chromaKey: RgbColor): Buffer;
|
|
53
|
+
type BackgroundRemoval = {
|
|
54
|
+
kind: "chroma";
|
|
55
|
+
chromaKey: RgbColor;
|
|
56
|
+
} | {
|
|
57
|
+
kind: "edge-matte";
|
|
58
|
+
matteColor: RgbColor;
|
|
59
|
+
};
|
|
60
|
+
export declare function detectBackgroundRemoval(png: PNG, chromaKey: RgbColor): BackgroundRemoval | undefined;
|
|
61
|
+
export declare function hasRequestedChromaKey(png: PNG, chromaKey: RgbColor): boolean;
|
|
62
|
+
export declare function detectNeutralEdgeMatte(png: PNG): RgbColor | undefined;
|
|
63
|
+
export declare function resizePngToDimensions(image: Uint8Array, dimensions: AiAssetDimensions): Buffer;
|
|
64
|
+
export declare function featherBackgroundEdges(png: PNG, transparent: Uint8Array, backgroundRemoval: BackgroundRemoval): void;
|
|
65
|
+
export declare function touchesTransparentNeighbor(transparent: Uint8Array, width: number, height: number, x: number, y: number): boolean;
|
|
66
|
+
export declare function isChromaPixel(png: PNG, index: number, tolerance: number, chromaKey: RgbColor): boolean;
|
|
67
|
+
export declare function isRemovableEdgeBackgroundPixel(png: PNG, index: number, backgroundRemoval: BackgroundRemoval): boolean;
|
|
68
|
+
export declare function isKeyTintedPixel(color: RgbColor, chromaKey: RgbColor, strength: number): boolean;
|
|
69
|
+
export declare function promptMentionsChromaFamily(prompt: string, chromaKey: RgbColor): boolean;
|
|
70
|
+
export declare function chromaDistance(png: PNG, index: number, chromaKey: RgbColor): number;
|
|
71
|
+
export declare function backgroundDistance(png: PNG, index: number, backgroundRemoval: BackgroundRemoval): number;
|
|
72
|
+
export declare function isNeutralMattePixel(color: RgbColor, matteColor: RgbColor): boolean;
|
|
73
|
+
export declare function isNeutralMatteCandidate(color: RgbColor): boolean;
|
|
74
|
+
export declare function neutralCornerCount(png: PNG): number;
|
|
75
|
+
export declare function sampleImageEdges(png: PNG, predicate: (index: number) => boolean): {
|
|
76
|
+
total: number;
|
|
77
|
+
matches: number;
|
|
78
|
+
};
|
|
79
|
+
export declare function rgbAt(png: PNG, index: number): RgbColor;
|
|
80
|
+
export declare function alphaAt(png: PNG, index: number): number;
|
|
81
|
+
export declare function setAlpha(png: PNG, index: number, alpha: number): void;
|
|
82
|
+
export {};
|
|
83
|
+
//# sourceMappingURL=provider-image-processing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-image-processing.d.ts","sourceRoot":"","sources":["../src/provider-image-processing.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,503 @@
|
|
|
1
|
+
import { PNG } from "pngjs";
|
|
2
|
+
const DEFAULT_CHROMA_KEY = { red: 255, green: 0, blue: 255 };
|
|
3
|
+
const CHROMA_KEY_CANDIDATES = [
|
|
4
|
+
DEFAULT_CHROMA_KEY,
|
|
5
|
+
{ red: 0, green: 255, blue: 0 },
|
|
6
|
+
{ red: 0, green: 255, blue: 255 },
|
|
7
|
+
{ red: 255, green: 255, blue: 0 },
|
|
8
|
+
{ red: 0, green: 0, blue: 255 }
|
|
9
|
+
];
|
|
10
|
+
const CHROMA_MATCH_TOLERANCE = 120;
|
|
11
|
+
const CHROMA_EDGE_TOLERANCE = 170;
|
|
12
|
+
const CHROMA_EDGE_FILL_TOLERANCE = 150;
|
|
13
|
+
export function selectChromaKey(request) {
|
|
14
|
+
const samples = [...(request.references ?? []), ...(request.styleReferences ?? [])]
|
|
15
|
+
.flatMap((reference) => referenceColorSamples(reference));
|
|
16
|
+
const prompt = `${request.prompt ?? ""} ${request.asset.prompt}`.toLowerCase();
|
|
17
|
+
if (!samples.length) {
|
|
18
|
+
return CHROMA_KEY_CANDIDATES.find((candidate) => !promptMentionsChromaFamily(prompt, candidate)) ??
|
|
19
|
+
DEFAULT_CHROMA_KEY;
|
|
20
|
+
}
|
|
21
|
+
return CHROMA_KEY_CANDIDATES
|
|
22
|
+
.filter((candidate) => !promptMentionsChromaFamily(prompt, candidate))
|
|
23
|
+
.map((candidate) => ({
|
|
24
|
+
candidate,
|
|
25
|
+
score: Math.min(...samples.map((sample) => colorDistance(candidate, sample)))
|
|
26
|
+
}))
|
|
27
|
+
.sort((left, right) => right.score - left.score)[0]?.candidate ??
|
|
28
|
+
CHROMA_KEY_CANDIDATES
|
|
29
|
+
.map((candidate) => ({
|
|
30
|
+
candidate,
|
|
31
|
+
score: Math.min(...samples.map((sample) => colorDistance(candidate, sample)))
|
|
32
|
+
}))
|
|
33
|
+
.sort((left, right) => right.score - left.score)[0]?.candidate ??
|
|
34
|
+
DEFAULT_CHROMA_KEY;
|
|
35
|
+
}
|
|
36
|
+
export function referenceLockPromptLines(references) {
|
|
37
|
+
const analyses = references
|
|
38
|
+
.map((reference) => analyzeReferenceImage(reference))
|
|
39
|
+
.filter((analysis) => analysis !== undefined);
|
|
40
|
+
if (!analyses.length) {
|
|
41
|
+
return [
|
|
42
|
+
"Treat the reference image as the visual source of truth. The prompt describes the action or state, not a redesign."
|
|
43
|
+
];
|
|
44
|
+
}
|
|
45
|
+
return analyses.flatMap((analysis, index) => {
|
|
46
|
+
const label = references.length === 1 ? "Reference" : `Reference ${index + 1}`;
|
|
47
|
+
const lines = [
|
|
48
|
+
`${label} color lock: dominant visible colors are ${analysis.dominantColors.join(", ")}.`,
|
|
49
|
+
"Preserve the reference colors as filled body and material regions in every frame, not merely as outlines, rims, shadows, glows, or small accents."
|
|
50
|
+
];
|
|
51
|
+
if (analysis.saturatedColors.length) {
|
|
52
|
+
lines.push(`${label} saturated-fill lock: the strongest chromatic fill colors are ${analysis.saturatedColors.join(", ")}. Keep those saturated colors prominent at roughly the same visual coverage as the reference.`);
|
|
53
|
+
}
|
|
54
|
+
if (analysis.brightSaturatedColors.length) {
|
|
55
|
+
lines.push(`${label} bright-fill lock: bright saturated colors cover about ${analysis.brightSaturatedCoveragePercent}% of the visible reference pixels; keep bright filled regions visibly prominent in every frame. Bright fill colors include ${analysis.brightSaturatedColors.join(", ")}.`, "Do not reinterpret bright filled body colors as black, charcoal, dark maroon, edge trim, outlines, or glow-only accents. Dark colors may be used only as secondary shading/linework if they are secondary in the reference.");
|
|
56
|
+
}
|
|
57
|
+
if (analysis.hasLargeDarkRegion && analysis.hasLargeSaturatedRegion) {
|
|
58
|
+
lines.push("Match the reference palette distribution: dark shading and black outlines must not take over body regions that are bright or saturated in the reference.");
|
|
59
|
+
}
|
|
60
|
+
return lines;
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
export function referenceColorSamples(reference) {
|
|
64
|
+
if (reference.mimeType !== "image/png")
|
|
65
|
+
return [];
|
|
66
|
+
let png;
|
|
67
|
+
try {
|
|
68
|
+
png = PNG.sync.read(Buffer.from(reference.image));
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
return [];
|
|
72
|
+
}
|
|
73
|
+
const bins = new Map();
|
|
74
|
+
for (let offset = 0; offset < png.data.length; offset += 4) {
|
|
75
|
+
const alpha = png.data[offset + 3] ?? 255;
|
|
76
|
+
if (alpha < 64)
|
|
77
|
+
continue;
|
|
78
|
+
const red = png.data[offset] ?? 0;
|
|
79
|
+
const green = png.data[offset + 1] ?? 0;
|
|
80
|
+
const blue = png.data[offset + 2] ?? 0;
|
|
81
|
+
addColorBin(bins, red, green, blue);
|
|
82
|
+
}
|
|
83
|
+
return topColorBinValues(bins, 8);
|
|
84
|
+
}
|
|
85
|
+
export function analyzeReferenceImage(reference) {
|
|
86
|
+
if (reference.mimeType !== "image/png")
|
|
87
|
+
return undefined;
|
|
88
|
+
let png;
|
|
89
|
+
try {
|
|
90
|
+
png = PNG.sync.read(Buffer.from(reference.image));
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
return undefined;
|
|
94
|
+
}
|
|
95
|
+
const allBins = new Map();
|
|
96
|
+
const saturatedBins = new Map();
|
|
97
|
+
const brightSaturatedBins = new Map();
|
|
98
|
+
let visiblePixels = 0;
|
|
99
|
+
let darkPixels = 0;
|
|
100
|
+
let saturatedPixels = 0;
|
|
101
|
+
let brightSaturatedPixels = 0;
|
|
102
|
+
for (let offset = 0; offset < png.data.length; offset += 4) {
|
|
103
|
+
const alpha = png.data[offset + 3] ?? 255;
|
|
104
|
+
if (alpha < 64)
|
|
105
|
+
continue;
|
|
106
|
+
const red = png.data[offset] ?? 0;
|
|
107
|
+
const green = png.data[offset + 1] ?? 0;
|
|
108
|
+
const blue = png.data[offset + 2] ?? 0;
|
|
109
|
+
if (isChromaRgb(red, green, blue))
|
|
110
|
+
continue;
|
|
111
|
+
visiblePixels += 1;
|
|
112
|
+
const max = Math.max(red, green, blue);
|
|
113
|
+
const min = Math.min(red, green, blue);
|
|
114
|
+
const saturation = max === 0 ? 0 : (max - min) / max;
|
|
115
|
+
const luminance = relativeLuminance(red, green, blue);
|
|
116
|
+
if (luminance < 45)
|
|
117
|
+
darkPixels += 1;
|
|
118
|
+
if (saturation > 0.45 && max > 120)
|
|
119
|
+
saturatedPixels += 1;
|
|
120
|
+
if (isBrightSaturatedColor(red, green, blue))
|
|
121
|
+
brightSaturatedPixels += 1;
|
|
122
|
+
addColorBin(allBins, red, green, blue);
|
|
123
|
+
if (saturation > 0.45 && max > 120) {
|
|
124
|
+
addColorBin(saturatedBins, red, green, blue);
|
|
125
|
+
}
|
|
126
|
+
if (isBrightSaturatedColor(red, green, blue)) {
|
|
127
|
+
addColorBin(brightSaturatedBins, red, green, blue);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
if (visiblePixels === 0)
|
|
131
|
+
return undefined;
|
|
132
|
+
return {
|
|
133
|
+
dominantColors: topColorBins(allBins, 4),
|
|
134
|
+
saturatedColors: topColorBins(saturatedBins, 3),
|
|
135
|
+
brightSaturatedColors: topColorBins(brightSaturatedBins, 3),
|
|
136
|
+
brightSaturatedCoveragePercent: ((brightSaturatedPixels / visiblePixels) * 100).toFixed(0),
|
|
137
|
+
hasLargeDarkRegion: darkPixels / visiblePixels > 0.28,
|
|
138
|
+
hasLargeSaturatedRegion: saturatedPixels / visiblePixels > 0.28
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
export function addColorBin(bins, red, green, blue) {
|
|
142
|
+
const key = `${quantizeColor(red)}:${quantizeColor(green)}:${quantizeColor(blue)}`;
|
|
143
|
+
const bin = bins.get(key) ?? {
|
|
144
|
+
count: 0,
|
|
145
|
+
redTotal: 0,
|
|
146
|
+
greenTotal: 0,
|
|
147
|
+
blueTotal: 0
|
|
148
|
+
};
|
|
149
|
+
bin.count += 1;
|
|
150
|
+
bin.redTotal += red;
|
|
151
|
+
bin.greenTotal += green;
|
|
152
|
+
bin.blueTotal += blue;
|
|
153
|
+
bins.set(key, bin);
|
|
154
|
+
}
|
|
155
|
+
export function topColorBins(bins, count) {
|
|
156
|
+
return topColorBinValues(bins, count)
|
|
157
|
+
.map((color) => `${colorName(color.red, color.green, color.blue)} ${rgbColor(color)}`);
|
|
158
|
+
}
|
|
159
|
+
export function topColorBinValues(bins, count) {
|
|
160
|
+
return [...bins.values()]
|
|
161
|
+
.sort((left, right) => right.count - left.count)
|
|
162
|
+
.slice(0, count)
|
|
163
|
+
.map((bin) => {
|
|
164
|
+
return {
|
|
165
|
+
red: Math.round(bin.redTotal / bin.count),
|
|
166
|
+
green: Math.round(bin.greenTotal / bin.count),
|
|
167
|
+
blue: Math.round(bin.blueTotal / bin.count)
|
|
168
|
+
};
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
export function quantizeColor(value) {
|
|
172
|
+
return Math.round(value / 32) * 32;
|
|
173
|
+
}
|
|
174
|
+
export function isChromaRgb(red, green, blue) {
|
|
175
|
+
return CHROMA_KEY_CANDIDATES.some((chromaKey) => (colorDistance({ red, green, blue }, chromaKey) < 90));
|
|
176
|
+
}
|
|
177
|
+
export function isBrightSaturatedColor(red, green, blue) {
|
|
178
|
+
const max = Math.max(red, green, blue);
|
|
179
|
+
const min = Math.min(red, green, blue);
|
|
180
|
+
const saturation = max === 0 ? 0 : (max - min) / max;
|
|
181
|
+
return saturation > 0.5 && max > 175 && relativeLuminance(red, green, blue) > 55;
|
|
182
|
+
}
|
|
183
|
+
export function relativeLuminance(red, green, blue) {
|
|
184
|
+
return red * 0.2126 + green * 0.7152 + blue * 0.0722;
|
|
185
|
+
}
|
|
186
|
+
export function colorName(red, green, blue) {
|
|
187
|
+
const max = Math.max(red, green, blue);
|
|
188
|
+
const min = Math.min(red, green, blue);
|
|
189
|
+
const saturation = max === 0 ? 0 : (max - min) / max;
|
|
190
|
+
const luminance = relativeLuminance(red, green, blue);
|
|
191
|
+
if (luminance < 45)
|
|
192
|
+
return "dark";
|
|
193
|
+
if (saturation < 0.18)
|
|
194
|
+
return luminance > 185 ? "light neutral" : "neutral";
|
|
195
|
+
if (red >= green && red >= blue)
|
|
196
|
+
return red - blue > 60 ? "red" : "magenta";
|
|
197
|
+
if (green >= red && green >= blue)
|
|
198
|
+
return green - blue > 40 ? "green" : "cyan";
|
|
199
|
+
if (blue >= red && blue >= green)
|
|
200
|
+
return blue - red > 40 ? "blue" : "purple";
|
|
201
|
+
return "color";
|
|
202
|
+
}
|
|
203
|
+
export function colorDistance(left, right) {
|
|
204
|
+
const redDelta = left.red - right.red;
|
|
205
|
+
const greenDelta = left.green - right.green;
|
|
206
|
+
const blueDelta = left.blue - right.blue;
|
|
207
|
+
return Math.sqrt(redDelta * redDelta + greenDelta * greenDelta + blueDelta * blueDelta);
|
|
208
|
+
}
|
|
209
|
+
export function hexColor(color) {
|
|
210
|
+
const channel = (value) => value.toString(16).padStart(2, "0");
|
|
211
|
+
return `#${channel(color.red)}${channel(color.green)}${channel(color.blue)}`;
|
|
212
|
+
}
|
|
213
|
+
export function rgbColor(color) {
|
|
214
|
+
return `rgb(${color.red}, ${color.green}, ${color.blue})`;
|
|
215
|
+
}
|
|
216
|
+
export function variationDirectionPromptLine(index) {
|
|
217
|
+
const variants = [
|
|
218
|
+
"Variation direction: explore a distinct pose progression with stronger start/end contrast. Make each frame visibly different while preserving the referenced identity, palette distribution, and materials.",
|
|
219
|
+
"Variation direction: explore different timing and spacing, with motion concentrated in different frames. Make each frame visibly different while preserving the referenced identity, palette distribution, and materials.",
|
|
220
|
+
"Variation direction: explore different secondary motion and effect shapes that still follow the asset prompt. Make each frame visibly different while preserving the referenced identity, palette distribution, and materials.",
|
|
221
|
+
"Variation direction: explore a different silhouette rhythm and scale/spacing balance inside each frame. Make each frame visibly different while preserving the referenced identity, palette distribution, and materials."
|
|
222
|
+
];
|
|
223
|
+
return variants[index % variants.length];
|
|
224
|
+
}
|
|
225
|
+
export function shouldRequestRgbaPng(request, context) {
|
|
226
|
+
if (!context.model.startsWith("gpt-image-2") || context.outputFormat !== "png") {
|
|
227
|
+
return false;
|
|
228
|
+
}
|
|
229
|
+
return (context.requestedBackground === "transparent" ||
|
|
230
|
+
/\btransparent\b/i.test(context.prompt) ||
|
|
231
|
+
/\btransparent\b/i.test(request.asset.prompt));
|
|
232
|
+
}
|
|
233
|
+
export function resolveRequestedBackground(request, options) {
|
|
234
|
+
const requested = request.settings?.background ??
|
|
235
|
+
request.asset.settings?.background;
|
|
236
|
+
if (requested && requested !== "auto") {
|
|
237
|
+
return requested;
|
|
238
|
+
}
|
|
239
|
+
return options.background ?? "transparent";
|
|
240
|
+
}
|
|
241
|
+
export function shouldPostprocessTransparency(request, context) {
|
|
242
|
+
return shouldRequestRgbaPng(request, context);
|
|
243
|
+
}
|
|
244
|
+
export function removeChromaBackground(image, chromaKey) {
|
|
245
|
+
const png = PNG.sync.read(Buffer.from(image));
|
|
246
|
+
const width = png.width;
|
|
247
|
+
const height = png.height;
|
|
248
|
+
const visited = new Uint8Array(width * height);
|
|
249
|
+
const transparent = new Uint8Array(width * height);
|
|
250
|
+
const queue = [];
|
|
251
|
+
let queueCursor = 0;
|
|
252
|
+
const backgroundRemoval = detectBackgroundRemoval(png, chromaKey);
|
|
253
|
+
if (!backgroundRemoval) {
|
|
254
|
+
return Buffer.from(image);
|
|
255
|
+
}
|
|
256
|
+
const enqueue = (x, y) => {
|
|
257
|
+
if (x < 0 || y < 0 || x >= width || y >= height)
|
|
258
|
+
return;
|
|
259
|
+
const index = y * width + x;
|
|
260
|
+
if (visited[index])
|
|
261
|
+
return;
|
|
262
|
+
visited[index] = 1;
|
|
263
|
+
if (isRemovableEdgeBackgroundPixel(png, index, backgroundRemoval)) {
|
|
264
|
+
queue.push(index);
|
|
265
|
+
}
|
|
266
|
+
};
|
|
267
|
+
for (let x = 0; x < width; x += 1) {
|
|
268
|
+
enqueue(x, 0);
|
|
269
|
+
enqueue(x, height - 1);
|
|
270
|
+
}
|
|
271
|
+
for (let y = 1; y < height - 1; y += 1) {
|
|
272
|
+
enqueue(0, y);
|
|
273
|
+
enqueue(width - 1, y);
|
|
274
|
+
}
|
|
275
|
+
while (queueCursor < queue.length) {
|
|
276
|
+
const index = queue[queueCursor];
|
|
277
|
+
queueCursor += 1;
|
|
278
|
+
transparent[index] = 1;
|
|
279
|
+
const x = index % width;
|
|
280
|
+
const y = Math.floor(index / width);
|
|
281
|
+
enqueue(x + 1, y);
|
|
282
|
+
enqueue(x - 1, y);
|
|
283
|
+
enqueue(x, y + 1);
|
|
284
|
+
enqueue(x, y - 1);
|
|
285
|
+
}
|
|
286
|
+
for (let index = 0; index < transparent.length; index += 1) {
|
|
287
|
+
if (transparent[index]) {
|
|
288
|
+
transparent[index] = 1;
|
|
289
|
+
setAlpha(png, index, 0);
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
featherBackgroundEdges(png, transparent, backgroundRemoval);
|
|
293
|
+
return PNG.sync.write(png);
|
|
294
|
+
}
|
|
295
|
+
export function detectBackgroundRemoval(png, chromaKey) {
|
|
296
|
+
if (hasRequestedChromaKey(png, chromaKey)) {
|
|
297
|
+
return { kind: "chroma", chromaKey };
|
|
298
|
+
}
|
|
299
|
+
const matteColor = detectNeutralEdgeMatte(png);
|
|
300
|
+
return matteColor ? { kind: "edge-matte", matteColor } : undefined;
|
|
301
|
+
}
|
|
302
|
+
export function hasRequestedChromaKey(png, chromaKey) {
|
|
303
|
+
const edgeStats = sampleImageEdges(png, (index) => (isChromaPixel(png, index, 90, chromaKey) ||
|
|
304
|
+
isKeyTintedPixel(rgbAt(png, index), chromaKey, 0.8)));
|
|
305
|
+
if (edgeStats.matches / edgeStats.total >= 0.18)
|
|
306
|
+
return true;
|
|
307
|
+
let matches = 0;
|
|
308
|
+
const threshold = Math.max(256, Math.floor(png.width * png.height * 0.005));
|
|
309
|
+
for (let index = 0; index < png.width * png.height; index += 1) {
|
|
310
|
+
if (isChromaPixel(png, index, 90, chromaKey) ||
|
|
311
|
+
isKeyTintedPixel(rgbAt(png, index), chromaKey, 0.8)) {
|
|
312
|
+
matches += 1;
|
|
313
|
+
if (matches >= threshold)
|
|
314
|
+
return true;
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
return false;
|
|
318
|
+
}
|
|
319
|
+
export function detectNeutralEdgeMatte(png) {
|
|
320
|
+
let edgePixelCount = 0;
|
|
321
|
+
let neutralEdgePixelCount = 0;
|
|
322
|
+
let redTotal = 0;
|
|
323
|
+
let greenTotal = 0;
|
|
324
|
+
let blueTotal = 0;
|
|
325
|
+
sampleImageEdges(png, (index) => {
|
|
326
|
+
const color = rgbAt(png, index);
|
|
327
|
+
edgePixelCount += 1;
|
|
328
|
+
if (isNeutralMatteCandidate(color)) {
|
|
329
|
+
neutralEdgePixelCount += 1;
|
|
330
|
+
redTotal += color.red;
|
|
331
|
+
greenTotal += color.green;
|
|
332
|
+
blueTotal += color.blue;
|
|
333
|
+
}
|
|
334
|
+
return false;
|
|
335
|
+
});
|
|
336
|
+
if (neutralEdgePixelCount === 0 ||
|
|
337
|
+
neutralEdgePixelCount / edgePixelCount < 0.65 ||
|
|
338
|
+
neutralCornerCount(png) < 3) {
|
|
339
|
+
return undefined;
|
|
340
|
+
}
|
|
341
|
+
const matteColor = {
|
|
342
|
+
red: Math.round(redTotal / neutralEdgePixelCount),
|
|
343
|
+
green: Math.round(greenTotal / neutralEdgePixelCount),
|
|
344
|
+
blue: Math.round(blueTotal / neutralEdgePixelCount)
|
|
345
|
+
};
|
|
346
|
+
const matteStats = sampleImageEdges(png, (index) => (isNeutralMattePixel(rgbAt(png, index), matteColor)));
|
|
347
|
+
return matteStats.matches / matteStats.total >= 0.55 ? matteColor : undefined;
|
|
348
|
+
}
|
|
349
|
+
export function resizePngToDimensions(image, dimensions) {
|
|
350
|
+
const source = PNG.sync.read(Buffer.from(image));
|
|
351
|
+
if (source.width === dimensions.width && source.height === dimensions.height) {
|
|
352
|
+
return Buffer.from(image);
|
|
353
|
+
}
|
|
354
|
+
const target = new PNG({
|
|
355
|
+
width: dimensions.width,
|
|
356
|
+
height: dimensions.height
|
|
357
|
+
});
|
|
358
|
+
for (let y = 0; y < dimensions.height; y += 1) {
|
|
359
|
+
const sourceY = Math.min(source.height - 1, Math.floor((y / dimensions.height) * source.height));
|
|
360
|
+
for (let x = 0; x < dimensions.width; x += 1) {
|
|
361
|
+
const sourceX = Math.min(source.width - 1, Math.floor((x / dimensions.width) * source.width));
|
|
362
|
+
const sourceOffset = (sourceY * source.width + sourceX) * 4;
|
|
363
|
+
const targetOffset = (y * dimensions.width + x) * 4;
|
|
364
|
+
target.data[targetOffset] = source.data[sourceOffset] ?? 0;
|
|
365
|
+
target.data[targetOffset + 1] = source.data[sourceOffset + 1] ?? 0;
|
|
366
|
+
target.data[targetOffset + 2] = source.data[sourceOffset + 2] ?? 0;
|
|
367
|
+
target.data[targetOffset + 3] = source.data[sourceOffset + 3] ?? 0;
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
return PNG.sync.write(target);
|
|
371
|
+
}
|
|
372
|
+
export function featherBackgroundEdges(png, transparent, backgroundRemoval) {
|
|
373
|
+
const width = png.width;
|
|
374
|
+
const height = png.height;
|
|
375
|
+
for (let y = 0; y < height; y += 1) {
|
|
376
|
+
for (let x = 0; x < width; x += 1) {
|
|
377
|
+
const index = y * width + x;
|
|
378
|
+
if (transparent[index] || !touchesTransparentNeighbor(transparent, width, height, x, y)) {
|
|
379
|
+
continue;
|
|
380
|
+
}
|
|
381
|
+
const distance = backgroundDistance(png, index, backgroundRemoval);
|
|
382
|
+
if (distance > CHROMA_EDGE_TOLERANCE) {
|
|
383
|
+
continue;
|
|
384
|
+
}
|
|
385
|
+
const alpha = Math.max(0, Math.min(255, Math.round((distance / CHROMA_EDGE_TOLERANCE) * 255)));
|
|
386
|
+
setAlpha(png, index, Math.min(alphaAt(png, index), alpha));
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
export function touchesTransparentNeighbor(transparent, width, height, x, y) {
|
|
391
|
+
return ((x > 0 && transparent[y * width + x - 1] === 1) ||
|
|
392
|
+
(x < width - 1 && transparent[y * width + x + 1] === 1) ||
|
|
393
|
+
(y > 0 && transparent[(y - 1) * width + x] === 1) ||
|
|
394
|
+
(y < height - 1 && transparent[(y + 1) * width + x] === 1));
|
|
395
|
+
}
|
|
396
|
+
export function isChromaPixel(png, index, tolerance, chromaKey) {
|
|
397
|
+
return chromaDistance(png, index, chromaKey) <= tolerance;
|
|
398
|
+
}
|
|
399
|
+
export function isRemovableEdgeBackgroundPixel(png, index, backgroundRemoval) {
|
|
400
|
+
if (backgroundRemoval.kind === "chroma") {
|
|
401
|
+
return (isChromaPixel(png, index, CHROMA_EDGE_FILL_TOLERANCE, backgroundRemoval.chromaKey) ||
|
|
402
|
+
isKeyTintedPixel(rgbAt(png, index), backgroundRemoval.chromaKey, 0.86));
|
|
403
|
+
}
|
|
404
|
+
return isNeutralMattePixel(rgbAt(png, index), backgroundRemoval.matteColor);
|
|
405
|
+
}
|
|
406
|
+
export function isKeyTintedPixel(color, chromaKey, strength) {
|
|
407
|
+
const keyChannels = [
|
|
408
|
+
{ color: color.red, key: chromaKey.red },
|
|
409
|
+
{ color: color.green, key: chromaKey.green },
|
|
410
|
+
{ color: color.blue, key: chromaKey.blue }
|
|
411
|
+
];
|
|
412
|
+
const activeChannels = keyChannels.filter((channel) => channel.key > 128);
|
|
413
|
+
const inactiveChannels = keyChannels.filter((channel) => channel.key <= 128);
|
|
414
|
+
return (activeChannels.every((channel) => channel.color >= 150 * strength) &&
|
|
415
|
+
inactiveChannels.every((channel) => channel.color <= 190 * (1.1 - strength)));
|
|
416
|
+
}
|
|
417
|
+
export function promptMentionsChromaFamily(prompt, chromaKey) {
|
|
418
|
+
if (chromaKey.red === 255 && chromaKey.green === 0 && chromaKey.blue === 255) {
|
|
419
|
+
return /\b(red|pink|purple|magenta|violet|crimson|fuchsia)\b/.test(prompt);
|
|
420
|
+
}
|
|
421
|
+
if (chromaKey.red === 0 && chromaKey.green === 255 && chromaKey.blue === 0) {
|
|
422
|
+
return /\b(green|lime|emerald|neon green|chartreuse)\b/.test(prompt);
|
|
423
|
+
}
|
|
424
|
+
if (chromaKey.red === 0 && chromaKey.green === 255 && chromaKey.blue === 255) {
|
|
425
|
+
return /\b(cyan|aqua|teal|turquoise|blue)\b/.test(prompt);
|
|
426
|
+
}
|
|
427
|
+
if (chromaKey.red === 255 && chromaKey.green === 255 && chromaKey.blue === 0) {
|
|
428
|
+
return /\b(yellow|gold|golden|amber)\b/.test(prompt);
|
|
429
|
+
}
|
|
430
|
+
if (chromaKey.red === 0 && chromaKey.green === 0 && chromaKey.blue === 255) {
|
|
431
|
+
return /\b(blue|navy|cobalt|azure|indigo|cyan)\b/.test(prompt);
|
|
432
|
+
}
|
|
433
|
+
return false;
|
|
434
|
+
}
|
|
435
|
+
export function chromaDistance(png, index, chromaKey) {
|
|
436
|
+
return colorDistance(rgbAt(png, index), chromaKey);
|
|
437
|
+
}
|
|
438
|
+
export function backgroundDistance(png, index, backgroundRemoval) {
|
|
439
|
+
if (backgroundRemoval.kind === "chroma") {
|
|
440
|
+
return chromaDistance(png, index, backgroundRemoval.chromaKey);
|
|
441
|
+
}
|
|
442
|
+
return colorDistance(rgbAt(png, index), backgroundRemoval.matteColor);
|
|
443
|
+
}
|
|
444
|
+
export function isNeutralMattePixel(color, matteColor) {
|
|
445
|
+
const max = Math.max(color.red, color.green, color.blue);
|
|
446
|
+
const min = Math.min(color.red, color.green, color.blue);
|
|
447
|
+
const saturation = max === 0 ? 0 : (max - min) / max;
|
|
448
|
+
const luminance = relativeLuminance(color.red, color.green, color.blue);
|
|
449
|
+
const matteLuminance = relativeLuminance(matteColor.red, matteColor.green, matteColor.blue);
|
|
450
|
+
return (saturation <= 0.22 &&
|
|
451
|
+
luminance >= 80 &&
|
|
452
|
+
Math.abs(luminance - matteLuminance) <= 70 &&
|
|
453
|
+
colorDistance(color, matteColor) <= 92);
|
|
454
|
+
}
|
|
455
|
+
export function isNeutralMatteCandidate(color) {
|
|
456
|
+
const max = Math.max(color.red, color.green, color.blue);
|
|
457
|
+
const min = Math.min(color.red, color.green, color.blue);
|
|
458
|
+
const saturation = max === 0 ? 0 : (max - min) / max;
|
|
459
|
+
const luminance = relativeLuminance(color.red, color.green, color.blue);
|
|
460
|
+
return saturation <= 0.22 && luminance >= 75;
|
|
461
|
+
}
|
|
462
|
+
export function neutralCornerCount(png) {
|
|
463
|
+
return [
|
|
464
|
+
{ x: 0, y: 0 },
|
|
465
|
+
{ x: png.width - 1, y: 0 },
|
|
466
|
+
{ x: 0, y: png.height - 1 },
|
|
467
|
+
{ x: png.width - 1, y: png.height - 1 }
|
|
468
|
+
].filter(({ x, y }) => isNeutralMatteCandidate(rgbAt(png, y * png.width + x))).length;
|
|
469
|
+
}
|
|
470
|
+
export function sampleImageEdges(png, predicate) {
|
|
471
|
+
let total = 0;
|
|
472
|
+
let matches = 0;
|
|
473
|
+
const sample = (x, y) => {
|
|
474
|
+
total += 1;
|
|
475
|
+
if (predicate(y * png.width + x)) {
|
|
476
|
+
matches += 1;
|
|
477
|
+
}
|
|
478
|
+
};
|
|
479
|
+
for (let x = 0; x < png.width; x += 1) {
|
|
480
|
+
sample(x, 0);
|
|
481
|
+
sample(x, png.height - 1);
|
|
482
|
+
}
|
|
483
|
+
for (let y = 1; y < png.height - 1; y += 1) {
|
|
484
|
+
sample(0, y);
|
|
485
|
+
sample(png.width - 1, y);
|
|
486
|
+
}
|
|
487
|
+
return { total, matches };
|
|
488
|
+
}
|
|
489
|
+
export function rgbAt(png, index) {
|
|
490
|
+
const offset = index * 4;
|
|
491
|
+
return {
|
|
492
|
+
red: png.data[offset] ?? 0,
|
|
493
|
+
green: png.data[offset + 1] ?? 0,
|
|
494
|
+
blue: png.data[offset + 2] ?? 0
|
|
495
|
+
};
|
|
496
|
+
}
|
|
497
|
+
export function alphaAt(png, index) {
|
|
498
|
+
return png.data[index * 4 + 3] ?? 255;
|
|
499
|
+
}
|
|
500
|
+
export function setAlpha(png, index, alpha) {
|
|
501
|
+
png.data[index * 4 + 3] = alpha;
|
|
502
|
+
}
|
|
503
|
+
//# sourceMappingURL=provider-image-processing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-image-processing.js","sourceRoot":"","sources":["../src/provider-image-processing.ts"],"names":[],"mappings":"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"}
|