@a_ng_d/utils-ui-color-palette 1.7.0 → 1.7.2
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/README.md +46 -0
- package/dist/modules/dominant-colors/dominant-colors.d.ts +18 -3
- package/dist/modules/dominant-colors/dominant-colors.d.ts.map +1 -1
- package/dist/modules/dominant-colors/dominant-colors.js +137 -64
- package/dist/modules/dominant-colors/dominant-colors.js.map +1 -1
- package/dist/types/configuration.types.d.ts +1 -1
- package/dist/types/configuration.types.d.ts.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -184,6 +184,52 @@ dominantColors.updateOptions({
|
|
|
184
184
|
const options = dominantColors.getOptions()
|
|
185
185
|
```
|
|
186
186
|
|
|
187
|
+
#### Working with File Uploads (ArrayBuffer)
|
|
188
|
+
|
|
189
|
+
For modern web applications that need to extract colors from uploaded image files:
|
|
190
|
+
|
|
191
|
+
```typescript
|
|
192
|
+
import { DominantColors } from '@a_ng_d/utils-ui-color-palette'
|
|
193
|
+
|
|
194
|
+
// Handle file upload from user input
|
|
195
|
+
const handleImageUpload = async (event: Event) => {
|
|
196
|
+
const file = (event.target as HTMLInputElement).files?.[0]
|
|
197
|
+
if (!file) return
|
|
198
|
+
|
|
199
|
+
// Convert file to ArrayBuffer
|
|
200
|
+
const arrayBuffer = await file.arrayBuffer()
|
|
201
|
+
|
|
202
|
+
try {
|
|
203
|
+
// Simple usage: extract 5 dominant colors
|
|
204
|
+
const colors = await DominantColors.extract(arrayBuffer, 5)
|
|
205
|
+
|
|
206
|
+
console.log('Extracted colors:', colors)
|
|
207
|
+
// Each color object contains: { color, hex, percentage, count }
|
|
208
|
+
|
|
209
|
+
} catch (error) {
|
|
210
|
+
console.error('Error extracting colors:', error)
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
// Advanced usage with custom options
|
|
215
|
+
const extractColorsAdvanced = async (arrayBuffer: ArrayBuffer) => {
|
|
216
|
+
const colors = await DominantColors.fromArrayBuffer(arrayBuffer, {
|
|
217
|
+
colorCount: 8,
|
|
218
|
+
maxIterations: 100,
|
|
219
|
+
tolerance: 0.005,
|
|
220
|
+
skipTransparent: true,
|
|
221
|
+
maxImageSize: 300, // Resize large images for faster processing
|
|
222
|
+
})
|
|
223
|
+
|
|
224
|
+
return colors
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
// HTML file input example
|
|
228
|
+
// <input type="file" accept="image/*" onChange={handleImageUpload} />
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
**Note**: ArrayBuffer extraction requires a browser environment with Canvas API support.
|
|
232
|
+
|
|
187
233
|
### Color Harmony Generation
|
|
188
234
|
|
|
189
235
|
```typescript
|
|
@@ -1,15 +1,25 @@
|
|
|
1
1
|
import { ImageData, DominantColorResult, DominantColorsOptions } from '../../types/color.types';
|
|
2
2
|
|
|
3
|
+
interface DominantColorsInput extends DominantColorsOptions {
|
|
4
|
+
imageData?: ImageData;
|
|
5
|
+
arrayBuffer?: ArrayBuffer;
|
|
6
|
+
maxImageSize?: number;
|
|
7
|
+
}
|
|
3
8
|
export default class DominantColors {
|
|
4
9
|
private imageData;
|
|
5
10
|
private colorCount;
|
|
6
11
|
private maxIterations;
|
|
7
12
|
private tolerance;
|
|
8
13
|
private skipTransparent;
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
14
|
+
private maxImageSize;
|
|
15
|
+
constructor({ imageData, arrayBuffer, colorCount, maxIterations, tolerance, skipTransparent, maxImageSize, }: DominantColorsInput);
|
|
16
|
+
private arrayBuffer?;
|
|
17
|
+
private ensureImageData;
|
|
18
|
+
private decodeImageFromArrayBuffer;
|
|
19
|
+
/** Synchronous extraction for ImageData (backward compatibility) */
|
|
12
20
|
extractDominantColors: () => DominantColorResult[];
|
|
21
|
+
/** Asynchronous extraction for ArrayBuffer */
|
|
22
|
+
extractDominantColorsAsync: () => Promise<DominantColorResult[]>;
|
|
13
23
|
private extractPixels;
|
|
14
24
|
private performKMeans;
|
|
15
25
|
private initializeCentroids;
|
|
@@ -21,5 +31,10 @@ export default class DominantColors {
|
|
|
21
31
|
setColorCount: (count: number) => void;
|
|
22
32
|
updateOptions: (options: Partial<DominantColorsOptions>) => void;
|
|
23
33
|
getOptions: () => DominantColorsOptions;
|
|
34
|
+
/** Static method for simplified ArrayBuffer usage */
|
|
35
|
+
static fromArrayBuffer(arrayBuffer: ArrayBuffer, options?: Omit<DominantColorsInput, 'arrayBuffer' | 'imageData'>): Promise<DominantColorResult[]>;
|
|
36
|
+
/** Simplified static method for quick color extraction */
|
|
37
|
+
static extract(arrayBuffer: ArrayBuffer, colorCount?: number): Promise<DominantColorResult[]>;
|
|
24
38
|
}
|
|
39
|
+
export {};
|
|
25
40
|
//# sourceMappingURL=dominant-colors.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dominant-colors.d.ts","sourceRoot":"","sources":["../../../src/modules/dominant-colors/dominant-colors.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,SAAS,EACT,mBAAmB,EACnB,qBAAqB,EACtB,MAAM,kBAAkB,CAAA;AAEzB,MAAM,CAAC,OAAO,OAAO,cAAc;IACjC,OAAO,CAAC,SAAS,
|
|
1
|
+
{"version":3,"file":"dominant-colors.d.ts","sourceRoot":"","sources":["../../../src/modules/dominant-colors/dominant-colors.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,SAAS,EACT,mBAAmB,EACnB,qBAAqB,EACtB,MAAM,kBAAkB,CAAA;AAEzB,UAAU,mBAAoB,SAAQ,qBAAqB;IACzD,SAAS,CAAC,EAAE,SAAS,CAAA;IACrB,WAAW,CAAC,EAAE,WAAW,CAAA;IACzB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,CAAC,OAAO,OAAO,cAAc;IACjC,OAAO,CAAC,SAAS,CAAyB;IAC1C,OAAO,CAAC,UAAU,CAAQ;IAC1B,OAAO,CAAC,aAAa,CAAQ;IAC7B,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,YAAY,CAAQ;gBAEhB,EACV,SAAS,EACT,WAAW,EACX,UAAc,EACd,aAAkB,EAClB,SAAgB,EAChB,eAAsB,EACtB,YAAkB,GACnB,EAAE,mBAAmB;IAiBtB,OAAO,CAAC,WAAW,CAAC,CAAa;YAEnB,eAAe;YAMf,0BAA0B;IA2ExC,oEAAoE;IACpE,qBAAqB,QAAO,mBAAmB,EAAE,CAchD;IAED,8CAA8C;IAC9C,0BAA0B,QAAa,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAgBpE;IAED,OAAO,CAAC,aAAa,CAoBpB;IAED,OAAO,CAAC,aAAa,CA+BpB;IAED,OAAO,CAAC,mBAAmB,CA8B1B;IAED,OAAO,CAAC,mBAAmB,CAgB1B;IAED,OAAO,CAAC,iBAAiB,CAOxB;IAED,OAAO,CAAC,iBAAiB,CAWxB;IAED,OAAO,CAAC,YAAY,CAUnB;IAED,OAAO,CAAC,yBAAyB,CAmBhC;IAED,aAAa,UAAW,MAAM,KAAG,IAAI,CAEpC;IAED,aAAa,YAAa,OAAO,CAAC,qBAAqB,CAAC,KAAG,IAAI,CAO9D;IAED,UAAU,QAAO,qBAAqB,CAKpC;IAEF,qDAAqD;WACxC,eAAe,CAC1B,WAAW,EAAE,WAAW,EACxB,OAAO,GAAE,IAAI,CAAC,mBAAmB,EAAE,aAAa,GAAG,WAAW,CAAM,GACnE,OAAO,CAAC,mBAAmB,EAAE,CAAC;IASjC,0DAA0D;WAC7C,OAAO,CAClB,WAAW,EAAE,WAAW,EACxB,UAAU,GAAE,MAAU,GACrB,OAAO,CAAC,mBAAmB,EAAE,CAAC;CAGlC"}
|
|
@@ -1,86 +1,108 @@
|
|
|
1
|
-
var
|
|
2
|
-
var
|
|
3
|
-
var
|
|
4
|
-
import { c as
|
|
5
|
-
class
|
|
1
|
+
var C = Object.defineProperty;
|
|
2
|
+
var x = (l, t, e) => t in l ? C(l, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : l[t] = e;
|
|
3
|
+
var i = (l, t, e) => x(l, typeof t != "symbol" ? t + "" : t, e);
|
|
4
|
+
import { c as p } from "../../index-Beb8qoyd.js";
|
|
5
|
+
class f {
|
|
6
6
|
constructor({
|
|
7
7
|
imageData: t,
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
8
|
+
arrayBuffer: e,
|
|
9
|
+
colorCount: a = 5,
|
|
10
|
+
maxIterations: r = 50,
|
|
11
|
+
tolerance: s = 0.01,
|
|
12
|
+
skipTransparent: n = !0,
|
|
13
|
+
maxImageSize: o = 200
|
|
12
14
|
}) {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
15
|
+
i(this, "imageData", null);
|
|
16
|
+
i(this, "colorCount");
|
|
17
|
+
i(this, "maxIterations");
|
|
18
|
+
i(this, "tolerance");
|
|
19
|
+
i(this, "skipTransparent");
|
|
20
|
+
i(this, "maxImageSize");
|
|
21
|
+
i(this, "arrayBuffer");
|
|
22
|
+
/** Synchronous extraction for ImageData (backward compatibility) */
|
|
23
|
+
i(this, "extractDominantColors", () => {
|
|
24
|
+
if (!this.imageData)
|
|
25
|
+
throw new Error(
|
|
26
|
+
"No image data available. Use extractDominantColorsAsync() for ArrayBuffer."
|
|
27
|
+
);
|
|
28
|
+
const t = this.extractPixels();
|
|
29
|
+
if (t.length === 0) return [];
|
|
30
|
+
const e = this.performKMeans(t);
|
|
31
|
+
return this.calculateColorFrequencies(t, e).sort((r, s) => s.percentage - r.percentage);
|
|
32
|
+
});
|
|
33
|
+
/** Asynchronous extraction for ArrayBuffer */
|
|
34
|
+
i(this, "extractDominantColorsAsync", async () => {
|
|
35
|
+
if (await this.ensureImageData(), !this.imageData)
|
|
36
|
+
throw new Error(
|
|
37
|
+
"No image data available. Ensure ArrayBuffer was successfully decoded."
|
|
38
|
+
);
|
|
19
39
|
const t = this.extractPixels();
|
|
20
40
|
if (t.length === 0) return [];
|
|
21
41
|
const e = this.performKMeans(t);
|
|
22
|
-
return this.calculateColorFrequencies(t, e).sort((
|
|
42
|
+
return this.calculateColorFrequencies(t, e).sort((r, s) => s.percentage - r.percentage);
|
|
23
43
|
});
|
|
24
|
-
|
|
44
|
+
i(this, "extractPixels", () => {
|
|
45
|
+
if (!this.imageData)
|
|
46
|
+
throw new Error("No image data available");
|
|
25
47
|
const t = [], e = this.imageData.data;
|
|
26
|
-
for (let
|
|
27
|
-
const
|
|
28
|
-
this.skipTransparent &&
|
|
48
|
+
for (let a = 0; a < e.length; a += 4) {
|
|
49
|
+
const r = e[a], s = e[a + 1], n = e[a + 2], o = e[a + 3];
|
|
50
|
+
this.skipTransparent && o < 128 || t.push([r, s, n]);
|
|
29
51
|
}
|
|
30
52
|
return t;
|
|
31
53
|
});
|
|
32
|
-
|
|
33
|
-
let e = this.initializeCentroids(t),
|
|
34
|
-
for (;
|
|
35
|
-
|
|
36
|
-
const
|
|
54
|
+
i(this, "performKMeans", (t) => {
|
|
55
|
+
let e = this.initializeCentroids(t), a = [], r = 0;
|
|
56
|
+
for (; r < this.maxIterations && !this.hasConverged(e, a); ) {
|
|
57
|
+
a = e.map((n) => [...n]);
|
|
58
|
+
const s = Array.from(
|
|
37
59
|
{ length: this.colorCount },
|
|
38
60
|
() => []
|
|
39
61
|
);
|
|
40
|
-
t.forEach((
|
|
41
|
-
const
|
|
42
|
-
|
|
43
|
-
}), e =
|
|
62
|
+
t.forEach((n) => {
|
|
63
|
+
const o = this.findClosestCentroid(n, e);
|
|
64
|
+
s[o].push(n);
|
|
65
|
+
}), e = s.map((n) => n.length === 0 ? a[e.indexOf(e[0])] : this.calculateCentroid(n)), r++;
|
|
44
66
|
}
|
|
45
67
|
return e;
|
|
46
68
|
});
|
|
47
|
-
|
|
69
|
+
i(this, "initializeCentroids", (t) => {
|
|
48
70
|
const e = [];
|
|
49
71
|
e.push(t[Math.floor(Math.random() * t.length)]);
|
|
50
|
-
for (let
|
|
51
|
-
const
|
|
72
|
+
for (let a = 1; a < this.colorCount; a++) {
|
|
73
|
+
const r = t.map((c) => {
|
|
52
74
|
const h = Math.min(
|
|
53
75
|
...e.map(
|
|
54
|
-
(
|
|
76
|
+
(d) => this.calculateDistance(c, d)
|
|
55
77
|
)
|
|
56
78
|
);
|
|
57
79
|
return h * h;
|
|
58
|
-
}),
|
|
59
|
-
let
|
|
80
|
+
}), s = r.reduce((c, h) => c + h, 0), n = Math.random() * s;
|
|
81
|
+
let o = 0;
|
|
60
82
|
for (let c = 0; c < t.length; c++)
|
|
61
|
-
if (
|
|
83
|
+
if (o += r[c], o >= n) {
|
|
62
84
|
e.push(t[c]);
|
|
63
85
|
break;
|
|
64
86
|
}
|
|
65
87
|
}
|
|
66
88
|
return e;
|
|
67
89
|
});
|
|
68
|
-
|
|
69
|
-
let
|
|
70
|
-
return e.forEach((
|
|
71
|
-
const
|
|
72
|
-
|
|
73
|
-
}),
|
|
90
|
+
i(this, "findClosestCentroid", (t, e) => {
|
|
91
|
+
let a = 1 / 0, r = 0;
|
|
92
|
+
return e.forEach((s, n) => {
|
|
93
|
+
const o = this.calculateDistance(t, s);
|
|
94
|
+
o < a && (a = o, r = n);
|
|
95
|
+
}), r;
|
|
74
96
|
});
|
|
75
|
-
|
|
76
|
-
const [
|
|
97
|
+
i(this, "calculateDistance", (t, e) => {
|
|
98
|
+
const [a, r, s] = t, [n, o, c] = e;
|
|
77
99
|
return Math.sqrt(
|
|
78
|
-
Math.pow(
|
|
100
|
+
Math.pow(a - n, 2) + Math.pow(r - o, 2) + Math.pow(s - c, 2)
|
|
79
101
|
);
|
|
80
102
|
});
|
|
81
|
-
|
|
103
|
+
i(this, "calculateCentroid", (t) => {
|
|
82
104
|
const e = t.reduce(
|
|
83
|
-
(
|
|
105
|
+
(a, r) => [a[0] + r[0], a[1] + r[1], a[2] + r[2]],
|
|
84
106
|
[0, 0, 0]
|
|
85
107
|
);
|
|
86
108
|
return [
|
|
@@ -89,37 +111,88 @@ class p {
|
|
|
89
111
|
Math.round(e[2] / t.length)
|
|
90
112
|
];
|
|
91
113
|
});
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
const
|
|
95
|
-
t.forEach((
|
|
96
|
-
const
|
|
97
|
-
n
|
|
114
|
+
i(this, "hasConverged", (t, e) => e.length === 0 ? !1 : t.every((a, r) => this.calculateDistance(a, e[r]) < this.tolerance));
|
|
115
|
+
i(this, "calculateColorFrequencies", (t, e) => {
|
|
116
|
+
const a = new Array(e.length).fill(0);
|
|
117
|
+
t.forEach((s) => {
|
|
118
|
+
const n = this.findClosestCentroid(s, e);
|
|
119
|
+
a[n]++;
|
|
98
120
|
});
|
|
99
|
-
const
|
|
100
|
-
return e.map((
|
|
101
|
-
color:
|
|
102
|
-
hex:
|
|
103
|
-
count: n
|
|
104
|
-
percentage: parseFloat((n
|
|
121
|
+
const r = t.length;
|
|
122
|
+
return e.map((s, n) => ({
|
|
123
|
+
color: s,
|
|
124
|
+
hex: p.rgb(s[0], s[1], s[2]).hex(),
|
|
125
|
+
count: a[n],
|
|
126
|
+
percentage: parseFloat((a[n] / r * 100).toFixed(2))
|
|
105
127
|
}));
|
|
106
128
|
});
|
|
107
|
-
|
|
129
|
+
i(this, "setColorCount", (t) => {
|
|
108
130
|
this.colorCount = Math.max(1, Math.min(t, 20));
|
|
109
131
|
});
|
|
110
|
-
|
|
132
|
+
i(this, "updateOptions", (t) => {
|
|
111
133
|
t.colorCount !== void 0 && this.setColorCount(t.colorCount), t.maxIterations !== void 0 && (this.maxIterations = t.maxIterations), t.tolerance !== void 0 && (this.tolerance = t.tolerance), t.skipTransparent !== void 0 && (this.skipTransparent = t.skipTransparent);
|
|
112
134
|
});
|
|
113
|
-
|
|
135
|
+
i(this, "getOptions", () => ({
|
|
114
136
|
colorCount: this.colorCount,
|
|
115
137
|
maxIterations: this.maxIterations,
|
|
116
138
|
tolerance: this.tolerance,
|
|
117
139
|
skipTransparent: this.skipTransparent
|
|
118
140
|
}));
|
|
119
|
-
|
|
141
|
+
if (!t && !e)
|
|
142
|
+
throw new Error("Either imageData or arrayBuffer must be provided");
|
|
143
|
+
this.imageData = t || null, this.colorCount = a, this.maxIterations = r, this.tolerance = s, this.skipTransparent = n, this.maxImageSize = o, e && !t && (this.arrayBuffer = e);
|
|
144
|
+
}
|
|
145
|
+
async ensureImageData() {
|
|
146
|
+
!this.imageData && this.arrayBuffer && (this.imageData = await this.decodeImageFromArrayBuffer(this.arrayBuffer));
|
|
147
|
+
}
|
|
148
|
+
async decodeImageFromArrayBuffer(t) {
|
|
149
|
+
return new Promise((e, a) => {
|
|
150
|
+
const r = globalThis;
|
|
151
|
+
if (!r.document || !r.Image || !r.URL) {
|
|
152
|
+
a(new Error("Browser environment with Canvas API required"));
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
const s = new r.Blob([t]), n = r.URL.createObjectURL(s), o = new r.Image();
|
|
156
|
+
o.onload = () => {
|
|
157
|
+
try {
|
|
158
|
+
const c = r.document.createElement("canvas"), h = c.getContext("2d");
|
|
159
|
+
if (!h)
|
|
160
|
+
throw new Error("Failed to create canvas context");
|
|
161
|
+
const d = o.width / o.height;
|
|
162
|
+
let u = o.width, m = o.height;
|
|
163
|
+
Math.max(o.width, o.height) > this.maxImageSize && (o.width > o.height ? (u = this.maxImageSize, m = Math.round(this.maxImageSize / d)) : (m = this.maxImageSize, u = Math.round(this.maxImageSize * d))), c.width = u, c.height = m, h.drawImage(o, 0, 0, u, m);
|
|
164
|
+
const g = h.getImageData(
|
|
165
|
+
0,
|
|
166
|
+
0,
|
|
167
|
+
u,
|
|
168
|
+
m
|
|
169
|
+
), w = {
|
|
170
|
+
data: new Uint8ClampedArray(g.data),
|
|
171
|
+
width: g.width,
|
|
172
|
+
height: g.height
|
|
173
|
+
};
|
|
174
|
+
r.URL.revokeObjectURL(n), e(w);
|
|
175
|
+
} catch (c) {
|
|
176
|
+
r.URL.revokeObjectURL(n), a(c);
|
|
177
|
+
}
|
|
178
|
+
}, o.onerror = () => {
|
|
179
|
+
r.URL.revokeObjectURL(n), a(new Error("Failed to load image"));
|
|
180
|
+
}, o.src = n;
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
/** Static method for simplified ArrayBuffer usage */
|
|
184
|
+
static async fromArrayBuffer(t, e = {}) {
|
|
185
|
+
return new f({
|
|
186
|
+
arrayBuffer: t,
|
|
187
|
+
...e
|
|
188
|
+
}).extractDominantColorsAsync();
|
|
189
|
+
}
|
|
190
|
+
/** Simplified static method for quick color extraction */
|
|
191
|
+
static async extract(t, e = 5) {
|
|
192
|
+
return this.fromArrayBuffer(t, { colorCount: e });
|
|
120
193
|
}
|
|
121
194
|
}
|
|
122
195
|
export {
|
|
123
|
-
|
|
196
|
+
f as default
|
|
124
197
|
};
|
|
125
198
|
//# sourceMappingURL=dominant-colors.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dominant-colors.js","sources":["../../../src/modules/dominant-colors/dominant-colors.ts"],"sourcesContent":["import chroma from 'chroma-js'\nimport {\n Channel,\n HexModel,\n ImageData,\n DominantColorResult,\n DominantColorsOptions,\n} from '@tps/color.types'\n\nexport default class DominantColors {\n private imageData: ImageData\n private colorCount: number\n private maxIterations: number\n private tolerance: number\n private skipTransparent: boolean\n\n constructor({\n imageData,\n colorCount = 5,\n maxIterations = 50,\n tolerance = 0.01,\n skipTransparent = true,\n }: {\n imageData: ImageData\n } & DominantColorsOptions) {\n this.imageData = imageData\n this.colorCount = colorCount\n this.maxIterations = maxIterations\n this.tolerance = tolerance\n this.skipTransparent = skipTransparent\n }\n\n extractDominantColors = (): DominantColorResult[] => {\n const pixels = this.extractPixels()\n if (pixels.length === 0) return []\n\n const clusters = this.performKMeans(pixels)\n const results = this.calculateColorFrequencies(pixels, clusters)\n\n return results.sort((a, b) => b.percentage - a.percentage)\n }\n\n private extractPixels = (): Channel[] => {\n const pixels: Channel[] = []\n const data = this.imageData.data\n\n for (let i = 0; i < data.length; i += 4) {\n const r = data[i]\n const g = data[i + 1]\n const b = data[i + 2]\n const a = data[i + 3]\n\n if (this.skipTransparent && a < 128) continue\n\n pixels.push([r, g, b])\n }\n\n return pixels\n }\n\n private performKMeans = (pixels: Channel[]): Channel[] => {\n let centroids = this.initializeCentroids(pixels)\n let prevCentroids: Channel[] = []\n let iteration = 0\n\n while (\n iteration < this.maxIterations &&\n !this.hasConverged(centroids, prevCentroids)\n ) {\n prevCentroids = centroids.map((c) => [...c] as Channel)\n\n const clusters: Channel[][] = Array.from(\n { length: this.colorCount },\n () => []\n )\n\n pixels.forEach((pixel) => {\n const closestIndex = this.findClosestCentroid(pixel, centroids)\n clusters[closestIndex].push(pixel)\n })\n\n centroids = clusters.map((cluster) => {\n if (cluster.length === 0)\n return prevCentroids[centroids.indexOf(centroids[0])]\n return this.calculateCentroid(cluster)\n })\n\n iteration++\n }\n\n return centroids\n }\n\n private initializeCentroids = (pixels: Channel[]): Channel[] => {\n const centroids: Channel[] = []\n\n // K-means++ initialization\n centroids.push(pixels[Math.floor(Math.random() * pixels.length)])\n\n for (let i = 1; i < this.colorCount; i++) {\n const distances = pixels.map((pixel) => {\n const minDistance = Math.min(\n ...centroids.map((centroid) =>\n this.calculateDistance(pixel, centroid)\n )\n )\n return minDistance * minDistance\n })\n\n const totalDistance = distances.reduce((sum, d) => sum + d, 0)\n const threshold = Math.random() * totalDistance\n\n let cumulative = 0\n for (let j = 0; j < pixels.length; j++) {\n cumulative += distances[j]\n if (cumulative >= threshold) {\n centroids.push(pixels[j])\n break\n }\n }\n }\n\n return centroids\n }\n\n private findClosestCentroid = (\n pixel: Channel,\n centroids: Channel[]\n ): number => {\n let minDistance = Infinity\n let closestIndex = 0\n\n centroids.forEach((centroid, index) => {\n const distance = this.calculateDistance(pixel, centroid)\n if (distance < minDistance) {\n minDistance = distance\n closestIndex = index\n }\n })\n\n return closestIndex\n }\n\n private calculateDistance = (color1: Channel, color2: Channel): number => {\n const [r1, g1, b1] = color1\n const [r2, g2, b2] = color2\n\n return Math.sqrt(\n Math.pow(r1 - r2, 2) + Math.pow(g1 - g2, 2) + Math.pow(b1 - b2, 2)\n )\n }\n\n private calculateCentroid = (cluster: Channel[]): Channel => {\n const sum = cluster.reduce(\n (acc, pixel) => [acc[0] + pixel[0], acc[1] + pixel[1], acc[2] + pixel[2]],\n [0, 0, 0] as Channel\n )\n\n return [\n Math.round(sum[0] / cluster.length),\n Math.round(sum[1] / cluster.length),\n Math.round(sum[2] / cluster.length),\n ]\n }\n\n private hasConverged = (\n centroids: Channel[],\n prevCentroids: Channel[]\n ): boolean => {\n if (prevCentroids.length === 0) return false\n\n return centroids.every((centroid, index) => {\n const distance = this.calculateDistance(centroid, prevCentroids[index])\n return distance < this.tolerance\n })\n }\n\n private calculateColorFrequencies = (\n pixels: Channel[],\n centroids: Channel[]\n ): DominantColorResult[] => {\n const counts = new Array(centroids.length).fill(0)\n\n pixels.forEach((pixel) => {\n const closestIndex = this.findClosestCentroid(pixel, centroids)\n counts[closestIndex]++\n })\n\n const totalPixels = pixels.length\n\n return centroids.map((centroid, index) => ({\n color: centroid,\n hex: chroma.rgb(centroid[0], centroid[1], centroid[2]).hex() as HexModel,\n count: counts[index],\n percentage: parseFloat(((counts[index] / totalPixels) * 100).toFixed(2)),\n }))\n }\n\n setColorCount = (count: number): void => {\n this.colorCount = Math.max(1, Math.min(count, 20))\n }\n\n updateOptions = (options: Partial<DominantColorsOptions>): void => {\n if (options.colorCount !== undefined) this.setColorCount(options.colorCount)\n if (options.maxIterations !== undefined)\n this.maxIterations = options.maxIterations\n if (options.tolerance !== undefined) this.tolerance = options.tolerance\n if (options.skipTransparent !== undefined)\n this.skipTransparent = options.skipTransparent\n }\n\n getOptions = (): DominantColorsOptions => ({\n colorCount: this.colorCount,\n maxIterations: this.maxIterations,\n tolerance: this.tolerance,\n skipTransparent: this.skipTransparent,\n })\n}\n"],"names":["DominantColors","imageData","colorCount","maxIterations","tolerance","skipTransparent","__publicField","pixels","clusters","b","data","i","r","g","a","centroids","prevCentroids","iteration","c","pixel","closestIndex","cluster","distances","minDistance","centroid","totalDistance","sum","d","threshold","cumulative","j","index","distance","color1","color2","r1","g1","b1","r2","g2","b2","acc","counts","totalPixels","chroma","count","options"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"dominant-colors.js","sources":["../../../src/modules/dominant-colors/dominant-colors.ts"],"sourcesContent":["import chroma from 'chroma-js'\nimport {\n Channel,\n HexModel,\n ImageData,\n DominantColorResult,\n DominantColorsOptions,\n} from '@tps/color.types'\n\ninterface DominantColorsInput extends DominantColorsOptions {\n imageData?: ImageData\n arrayBuffer?: ArrayBuffer\n maxImageSize?: number\n}\n\nexport default class DominantColors {\n private imageData: ImageData | null = null\n private colorCount: number\n private maxIterations: number\n private tolerance: number\n private skipTransparent: boolean\n private maxImageSize: number\n\n constructor({\n imageData,\n arrayBuffer,\n colorCount = 5,\n maxIterations = 50,\n tolerance = 0.01,\n skipTransparent = true,\n maxImageSize = 200,\n }: DominantColorsInput) {\n if (!imageData && !arrayBuffer) {\n throw new Error('Either imageData or arrayBuffer must be provided')\n }\n\n this.imageData = imageData || null\n this.colorCount = colorCount\n this.maxIterations = maxIterations\n this.tolerance = tolerance\n this.skipTransparent = skipTransparent\n this.maxImageSize = maxImageSize\n\n if (arrayBuffer && !imageData) {\n this.arrayBuffer = arrayBuffer\n }\n }\n\n private arrayBuffer?: ArrayBuffer\n\n private async ensureImageData(): Promise<void> {\n if (!this.imageData && this.arrayBuffer) {\n this.imageData = await this.decodeImageFromArrayBuffer(this.arrayBuffer)\n }\n }\n\n private async decodeImageFromArrayBuffer(\n arrayBuffer: ArrayBuffer\n ): Promise<ImageData> {\n return new Promise((resolve, reject) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const globalWindow = globalThis as any\n\n if (!globalWindow.document || !globalWindow.Image || !globalWindow.URL) {\n reject(new Error('Browser environment with Canvas API required'))\n return\n }\n\n const blob = new globalWindow.Blob([arrayBuffer])\n const url = globalWindow.URL.createObjectURL(blob)\n const img = new globalWindow.Image()\n\n img.onload = () => {\n try {\n const canvas = globalWindow.document.createElement('canvas')\n const ctx = canvas.getContext('2d')\n\n if (!ctx) {\n throw new Error('Failed to create canvas context')\n }\n\n // Resize image if needed\n const aspectRatio = img.width / img.height\n let targetWidth = img.width\n let targetHeight = img.height\n\n if (Math.max(img.width, img.height) > this.maxImageSize) {\n if (img.width > img.height) {\n targetWidth = this.maxImageSize\n targetHeight = Math.round(this.maxImageSize / aspectRatio)\n } else {\n targetHeight = this.maxImageSize\n targetWidth = Math.round(this.maxImageSize * aspectRatio)\n }\n }\n\n canvas.width = targetWidth\n canvas.height = targetHeight\n\n ctx.drawImage(img, 0, 0, targetWidth, targetHeight)\n\n const browserImageData = ctx.getImageData(\n 0,\n 0,\n targetWidth,\n targetHeight\n )\n\n const imageData: ImageData = {\n data: new Uint8ClampedArray(browserImageData.data),\n width: browserImageData.width,\n height: browserImageData.height,\n }\n\n globalWindow.URL.revokeObjectURL(url)\n resolve(imageData)\n } catch (error) {\n globalWindow.URL.revokeObjectURL(url)\n reject(error)\n }\n }\n\n img.onerror = () => {\n globalWindow.URL.revokeObjectURL(url)\n reject(new Error('Failed to load image'))\n }\n\n img.src = url\n })\n }\n\n /** Synchronous extraction for ImageData (backward compatibility) */\n extractDominantColors = (): DominantColorResult[] => {\n if (!this.imageData) {\n throw new Error(\n 'No image data available. Use extractDominantColorsAsync() for ArrayBuffer.'\n )\n }\n\n const pixels = this.extractPixels()\n if (pixels.length === 0) return []\n\n const clusters = this.performKMeans(pixels)\n const results = this.calculateColorFrequencies(pixels, clusters)\n\n return results.sort((a, b) => b.percentage - a.percentage)\n }\n\n /** Asynchronous extraction for ArrayBuffer */\n extractDominantColorsAsync = async (): Promise<DominantColorResult[]> => {\n await this.ensureImageData()\n\n if (!this.imageData) {\n throw new Error(\n 'No image data available. Ensure ArrayBuffer was successfully decoded.'\n )\n }\n\n const pixels = this.extractPixels()\n if (pixels.length === 0) return []\n\n const clusters = this.performKMeans(pixels)\n const results = this.calculateColorFrequencies(pixels, clusters)\n\n return results.sort((a, b) => b.percentage - a.percentage)\n }\n\n private extractPixels = (): Channel[] => {\n if (!this.imageData) {\n throw new Error('No image data available')\n }\n\n const pixels: Channel[] = []\n const data = this.imageData.data\n\n for (let i = 0; i < data.length; i += 4) {\n const r = data[i]\n const g = data[i + 1]\n const b = data[i + 2]\n const a = data[i + 3]\n\n if (this.skipTransparent && a < 128) continue\n\n pixels.push([r, g, b])\n }\n\n return pixels\n }\n\n private performKMeans = (pixels: Channel[]): Channel[] => {\n let centroids = this.initializeCentroids(pixels)\n let prevCentroids: Channel[] = []\n let iteration = 0\n\n while (\n iteration < this.maxIterations &&\n !this.hasConverged(centroids, prevCentroids)\n ) {\n prevCentroids = centroids.map((c) => [...c] as Channel)\n\n const clusters: Channel[][] = Array.from(\n { length: this.colorCount },\n () => []\n )\n\n pixels.forEach((pixel) => {\n const closestIndex = this.findClosestCentroid(pixel, centroids)\n clusters[closestIndex].push(pixel)\n })\n\n centroids = clusters.map((cluster) => {\n if (cluster.length === 0)\n return prevCentroids[centroids.indexOf(centroids[0])]\n return this.calculateCentroid(cluster)\n })\n\n iteration++\n }\n\n return centroids\n }\n\n private initializeCentroids = (pixels: Channel[]): Channel[] => {\n const centroids: Channel[] = []\n\n // K-means++ initialization\n centroids.push(pixels[Math.floor(Math.random() * pixels.length)])\n\n for (let i = 1; i < this.colorCount; i++) {\n const distances = pixels.map((pixel) => {\n const minDistance = Math.min(\n ...centroids.map((centroid) =>\n this.calculateDistance(pixel, centroid)\n )\n )\n return minDistance * minDistance\n })\n\n const totalDistance = distances.reduce((sum, d) => sum + d, 0)\n const threshold = Math.random() * totalDistance\n\n let cumulative = 0\n for (let j = 0; j < pixels.length; j++) {\n cumulative += distances[j]\n if (cumulative >= threshold) {\n centroids.push(pixels[j])\n break\n }\n }\n }\n\n return centroids\n }\n\n private findClosestCentroid = (\n pixel: Channel,\n centroids: Channel[]\n ): number => {\n let minDistance = Infinity\n let closestIndex = 0\n\n centroids.forEach((centroid, index) => {\n const distance = this.calculateDistance(pixel, centroid)\n if (distance < minDistance) {\n minDistance = distance\n closestIndex = index\n }\n })\n\n return closestIndex\n }\n\n private calculateDistance = (color1: Channel, color2: Channel): number => {\n const [r1, g1, b1] = color1\n const [r2, g2, b2] = color2\n\n return Math.sqrt(\n Math.pow(r1 - r2, 2) + Math.pow(g1 - g2, 2) + Math.pow(b1 - b2, 2)\n )\n }\n\n private calculateCentroid = (cluster: Channel[]): Channel => {\n const sum = cluster.reduce(\n (acc, pixel) => [acc[0] + pixel[0], acc[1] + pixel[1], acc[2] + pixel[2]],\n [0, 0, 0] as Channel\n )\n\n return [\n Math.round(sum[0] / cluster.length),\n Math.round(sum[1] / cluster.length),\n Math.round(sum[2] / cluster.length),\n ]\n }\n\n private hasConverged = (\n centroids: Channel[],\n prevCentroids: Channel[]\n ): boolean => {\n if (prevCentroids.length === 0) return false\n\n return centroids.every((centroid, index) => {\n const distance = this.calculateDistance(centroid, prevCentroids[index])\n return distance < this.tolerance\n })\n }\n\n private calculateColorFrequencies = (\n pixels: Channel[],\n centroids: Channel[]\n ): DominantColorResult[] => {\n const counts = new Array(centroids.length).fill(0)\n\n pixels.forEach((pixel) => {\n const closestIndex = this.findClosestCentroid(pixel, centroids)\n counts[closestIndex]++\n })\n\n const totalPixels = pixels.length\n\n return centroids.map((centroid, index) => ({\n color: centroid,\n hex: chroma.rgb(centroid[0], centroid[1], centroid[2]).hex() as HexModel,\n count: counts[index],\n percentage: parseFloat(((counts[index] / totalPixels) * 100).toFixed(2)),\n }))\n }\n\n setColorCount = (count: number): void => {\n this.colorCount = Math.max(1, Math.min(count, 20))\n }\n\n updateOptions = (options: Partial<DominantColorsOptions>): void => {\n if (options.colorCount !== undefined) this.setColorCount(options.colorCount)\n if (options.maxIterations !== undefined)\n this.maxIterations = options.maxIterations\n if (options.tolerance !== undefined) this.tolerance = options.tolerance\n if (options.skipTransparent !== undefined)\n this.skipTransparent = options.skipTransparent\n }\n\n getOptions = (): DominantColorsOptions => ({\n colorCount: this.colorCount,\n maxIterations: this.maxIterations,\n tolerance: this.tolerance,\n skipTransparent: this.skipTransparent,\n })\n\n /** Static method for simplified ArrayBuffer usage */\n static async fromArrayBuffer(\n arrayBuffer: ArrayBuffer,\n options: Omit<DominantColorsInput, 'arrayBuffer' | 'imageData'> = {}\n ): Promise<DominantColorResult[]> {\n const decoder = new DominantColors({\n arrayBuffer,\n ...options,\n })\n\n return decoder.extractDominantColorsAsync()\n }\n\n /** Simplified static method for quick color extraction */\n static async extract(\n arrayBuffer: ArrayBuffer,\n colorCount: number = 5\n ): Promise<DominantColorResult[]> {\n return this.fromArrayBuffer(arrayBuffer, { colorCount })\n }\n}\n"],"names":["DominantColors","imageData","arrayBuffer","colorCount","maxIterations","tolerance","skipTransparent","maxImageSize","__publicField","pixels","clusters","a","b","data","i","g","centroids","prevCentroids","iteration","c","pixel","closestIndex","cluster","distances","minDistance","centroid","totalDistance","sum","d","threshold","cumulative","j","index","distance","color1","color2","r1","g1","b1","r2","g2","b2","acc","counts","totalPixels","chroma","count","options","resolve","reject","globalWindow","blob","url","img","canvas","ctx","aspectRatio","targetWidth","targetHeight","browserImageData","error"],"mappings":"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"}
|
|
@@ -26,7 +26,7 @@ export interface BaseConfiguration {
|
|
|
26
26
|
export interface SourceColorConfiguration {
|
|
27
27
|
name: string;
|
|
28
28
|
rgb: RgbModel;
|
|
29
|
-
source: 'CANVAS' | 'REMOTE' | ThirdParty;
|
|
29
|
+
source: 'CANVAS' | 'REMOTE' | 'DEFAULT' | 'IMAGE' | 'HARMONY' | ThirdParty;
|
|
30
30
|
id: string;
|
|
31
31
|
isRemovable: boolean;
|
|
32
32
|
hue?: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"configuration.types.d.ts","sourceRoot":"","sources":["../../src/types/configuration.types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAElD,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,iBAAiB,GAAG,eAAe,CAAA;AAExE,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,iBAAiB,CAAA;IACvB,MAAM,EAAE,KAAK,CAAC,kBAAkB,CAAC,CAAA;IACjC,IAAI,EAAE,iBAAiB,CAAA;IACvB,WAAW,EAAE,KAAK,CAAC,WAAW,CAAC,CAAA;IAC/B,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,kBAAkB,CAAA;CACzB;AAED,MAAM,WAAW,iBAAiB;IAChC,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,CAAA;IAC7D,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,mBAAmB,CAAA;IAC3B,KAAK,EAAE,kBAAkB,CAAA;IACzB,qBAAqB,EAAE,+BAA+B,CAAA;IACtD,MAAM,EAAE,KAAK,CAAC,kBAAkB,CAAC,CAAA;IACjC,UAAU,EAAE,uBAAuB,CAAA;IACnC,gBAAgB,EAAE,6BAA6B,CAAA;CAChD;AAED,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,QAAQ,CAAA;IACb,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"configuration.types.d.ts","sourceRoot":"","sources":["../../src/types/configuration.types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@a_ng_d/utils-ui-color-palette",
|
|
3
3
|
"private": false,
|
|
4
|
-
"version": "1.7.
|
|
4
|
+
"version": "1.7.2",
|
|
5
5
|
"description": "Core utilities library for UI Color Palette - a color management plugin for design tools. This library provides the foundational color manipulation, contrast calculation, and palette generation features used in the plugin.",
|
|
6
6
|
"repository": "https://github.com/a-ng-d/utils-ui-color-palette",
|
|
7
7
|
"keywords": [
|
|
@@ -58,4 +58,4 @@
|
|
|
58
58
|
"chroma-js": "^2.4.2",
|
|
59
59
|
"hsluv": "^1.0.1"
|
|
60
60
|
}
|
|
61
|
-
}
|
|
61
|
+
}
|