@richardmcquiston01/core-image 0.3.1 → 0.4.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/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @richardmcquiston01/core-image
2
2
 
3
- Image processing core for laser, CNC and other maker-machine workflows: a filter registry (dithering, tone, edge/morphology, transforms, test grids), image I/O helpers, and grayscale heightmap-to-STL conversion.
3
+ Image processing core for laser, CNC and other maker-machine workflows: a filter registry (dithering, tone, edge/morphology, effects such as blur, sepia and duotone, transforms, test grids), image I/O helpers, and grayscale heightmap-to-STL conversion.
4
4
 
5
5
  Part of [maker-image-tools](https://github.com/RichardMcQuiston01/maker-image-tools).
6
6
 
@@ -22,6 +22,8 @@ export declare const ditherJarvisJudiceNinke: Filter<DitherOptions>;
22
22
  export declare const ditherStucki: Filter<DitherOptions>;
23
23
  /** Sierra error-diffusion dithering (Frankie Sierra). */
24
24
  export declare const ditherSierra: Filter<DitherOptions>;
25
+ /** Two-row Sierra error-diffusion dithering (Frankie Sierra): a lighter, faster variant of Sierra. */
26
+ export declare const ditherTwoRowSierra: Filter<DitherOptions>;
25
27
  /** Burkes error-diffusion dithering (Daniel Burkes, 1988). */
26
28
  export declare const ditherBurkes: Filter<DitherOptions>;
27
29
  /** Bayer ordered dithering: compares each pixel against a tiled NxN threshold matrix. */
@@ -1 +1 @@
1
- {"version":3,"file":"dither.d.ts","sourceRoot":"","sources":["../../src/filters/dither.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGzD,gEAAgE;AAChE,MAAM,WAAW,aAAc,SAAQ,aAAa;IAClD,2FAA2F;IAC3F,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,6CAA6C;AAC7C,MAAM,WAAW,kBAAmB,SAAQ,aAAa;IACvD,wDAAwD;IACxD,UAAU,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;CACxB;AAED,+EAA+E;AAC/E,MAAM,MAAM,sBAAsB,GAAG,aAAa,CAAC;AAgGnD,2EAA2E;AAC3E,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,aAAa,CAGtD,CAAC;AAWF;4FAC4F;AAC5F,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,aAAa,CAGhD,CAAC;AAiBF,+DAA+D;AAC/D,eAAO,MAAM,uBAAuB,EAAE,MAAM,CAAC,aAAa,CAGzD,CAAC;AAiBF,+CAA+C;AAC/C,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,aAAa,CAG9C,CAAC;AAeF,yDAAyD;AACzD,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,aAAa,CAG9C,CAAC;AAYF,8DAA8D;AAC9D,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,aAAa,CAG9C,CAAC;AAoCF,yFAAyF;AACzF,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,kBAAkB,CAmBlD,CAAC;AAMF;;;;GAIG;AACH,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,sBAAsB,CAiB1D,CAAC"}
1
+ {"version":3,"file":"dither.d.ts","sourceRoot":"","sources":["../../src/filters/dither.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGzD,gEAAgE;AAChE,MAAM,WAAW,aAAc,SAAQ,aAAa;IAClD,2FAA2F;IAC3F,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,6CAA6C;AAC7C,MAAM,WAAW,kBAAmB,SAAQ,aAAa;IACvD,wDAAwD;IACxD,UAAU,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;CACxB;AAED,+EAA+E;AAC/E,MAAM,MAAM,sBAAsB,GAAG,aAAa,CAAC;AAgGnD,2EAA2E;AAC3E,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,aAAa,CAGtD,CAAC;AAWF;4FAC4F;AAC5F,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,aAAa,CAGhD,CAAC;AAiBF,+DAA+D;AAC/D,eAAO,MAAM,uBAAuB,EAAE,MAAM,CAAC,aAAa,CAGzD,CAAC;AAiBF,+CAA+C;AAC/C,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,aAAa,CAG9C,CAAC;AAeF,yDAAyD;AACzD,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,aAAa,CAG9C,CAAC;AAYF,sGAAsG;AACtG,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,aAAa,CAGpD,CAAC;AAYF,8DAA8D;AAC9D,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,aAAa,CAG9C,CAAC;AAoCF,yFAAyF;AACzF,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,kBAAkB,CAmBlD,CAAC;AAMF;;;;GAIG;AACH,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,sBAAsB,CAiB1D,CAAC"}
@@ -138,6 +138,20 @@ export const ditherSierra = (image, options) => {
138
138
  const threshold = options.threshold ?? DEFAULT_THRESHOLD;
139
139
  return diffuseErrorDither(image, threshold, SIERRA_KERNEL);
140
140
  };
141
+ const TWO_ROW_SIERRA_KERNEL = buildKernel(16, [
142
+ [1, 0, 4],
143
+ [2, 0, 3],
144
+ [-2, 1, 1],
145
+ [-1, 1, 2],
146
+ [0, 1, 3],
147
+ [1, 1, 2],
148
+ [2, 1, 1],
149
+ ]);
150
+ /** Two-row Sierra error-diffusion dithering (Frankie Sierra): a lighter, faster variant of Sierra. */
151
+ export const ditherTwoRowSierra = (image, options) => {
152
+ const threshold = options.threshold ?? DEFAULT_THRESHOLD;
153
+ return diffuseErrorDither(image, threshold, TWO_ROW_SIERRA_KERNEL);
154
+ };
141
155
  const BURKES_KERNEL = buildKernel(32, [
142
156
  [1, 0, 8],
143
157
  [2, 0, 4],
@@ -1 +1 @@
1
- {"version":3,"file":"dither.js","sourceRoot":"","sources":["../../src/filters/dither.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dither.js","sourceRoot":"","sources":["../../src/filters/dither.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ import type { Filter, FilterOptions } from "../types.js";
2
+ /** An sRGB colour as [red, green, blue], each 0-255. */
3
+ export type Rgb = [number, number, number];
4
+ export interface GaussianBlurOptions extends FilterOptions {
5
+ /** Standard deviation in pixels. 0 returns an unchanged copy. Default 2. */
6
+ sigma?: number;
7
+ }
8
+ /** Gaussian blur: the standard bell-shaped falloff, ideal for soft defocus. */
9
+ export declare const gaussianBlur: Filter<GaussianBlurOptions>;
10
+ export interface HighPassOptions extends FilterOptions {
11
+ /** Standard deviation of the blur that is subtracted. Default 3. */
12
+ sigma?: number;
13
+ /** Multiplier on the extracted detail. Default 1. */
14
+ amount?: number;
15
+ }
16
+ /**
17
+ * High pass: the image minus a blurred copy, centred on mid-grey, which keeps
18
+ * edges and fine detail and drops the broad tones. Alpha is left as it was.
19
+ */
20
+ export declare const highPass: Filter<HighPassOptions>;
21
+ export interface SepiaOptions extends FilterOptions {
22
+ /** 0 = unchanged, 1 = full sepia. Default 1. */
23
+ amount?: number;
24
+ }
25
+ /** Classic sepia tone for an antique-photograph look. */
26
+ export declare const sepia: Filter<SepiaOptions>;
27
+ export interface AlphaThresholdOptions extends FilterOptions {
28
+ /** Alpha at or above this (0-255) becomes fully opaque, below becomes transparent. Default 128. */
29
+ threshold?: number;
30
+ }
31
+ /** Makes semi-transparent pixels fully opaque or fully transparent, for crisp sticker-style cutouts. */
32
+ export declare const alphaThreshold: Filter<AlphaThresholdOptions>;
33
+ export interface PixelateOptions extends FilterOptions {
34
+ /** Side of each block in pixels (rounded, at least 1). Default 8. */
35
+ blockSize?: number;
36
+ }
37
+ /** Reduces the image to large flat blocks, each the average of the pixels it covers. */
38
+ export declare const pixelate: Filter<PixelateOptions>;
39
+ export interface DuotoneOptions extends FilterOptions {
40
+ /** Colour for the darkest tones. Default midnight blue. */
41
+ shadow?: Rgb;
42
+ /** Colour for the brightest tones. Default warm cream. */
43
+ highlight?: Rgb;
44
+ }
45
+ /** Maps brightness onto a two-colour gradient, for a graphic poster or branding look. */
46
+ export declare const duotone: Filter<DuotoneOptions>;
47
+ export interface CrossProcessOptions extends FilterOptions {
48
+ /** 0 = unchanged, 1 = full effect. Default 1. */
49
+ strength?: number;
50
+ }
51
+ /**
52
+ * Cross process: the vivid, colour-shifted look of film developed in the
53
+ * wrong chemicals. Red gains contrast, green a little, and blue is lifted in
54
+ * the shadows and held back in the highlights.
55
+ */
56
+ export declare const crossProcess: Filter<CrossProcessOptions>;
57
+ //# sourceMappingURL=effects.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"effects.d.ts","sourceRoot":"","sources":["../../src/filters/effects.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAWzD,wDAAwD;AACxD,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AA2E3C,MAAM,WAAW,mBAAoB,SAAQ,aAAa;IACxD,4EAA4E;IAC5E,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,+EAA+E;AAC/E,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,mBAAmB,CAIpD,CAAC;AAEF,MAAM,WAAW,eAAgB,SAAQ,aAAa;IACpD,oEAAoE;IACpE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qDAAqD;IACrD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,eAAO,MAAM,QAAQ,EAAE,MAAM,CAAC,eAAe,CAc5C,CAAC;AAEF,MAAM,WAAW,YAAa,SAAQ,aAAa;IACjD,gDAAgD;IAChD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,yDAAyD;AACzD,eAAO,MAAM,KAAK,EAAE,MAAM,CAAC,YAAY,CAgBtC,CAAC;AAEF,MAAM,WAAW,qBAAsB,SAAQ,aAAa;IAC1D,mGAAmG;IACnG,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wGAAwG;AACxG,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,qBAAqB,CAQxD,CAAC;AAEF,MAAM,WAAW,eAAgB,SAAQ,aAAa;IACpD,qEAAqE;IACrE,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wFAAwF;AACxF,eAAO,MAAM,QAAQ,EAAE,MAAM,CAAC,eAAe,CAwC5C,CAAC;AAEF,MAAM,WAAW,cAAe,SAAQ,aAAa;IACnD,2DAA2D;IAC3D,MAAM,CAAC,EAAE,GAAG,CAAC;IACb,0DAA0D;IAC1D,SAAS,CAAC,EAAE,GAAG,CAAC;CACjB;AAED,yFAAyF;AACzF,eAAO,MAAM,OAAO,EAAE,MAAM,CAAC,cAAc,CAa1C,CAAC;AAEF,MAAM,WAAW,mBAAoB,SAAQ,aAAa;IACxD,iDAAiD;IACjD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AASD;;;;GAIG;AACH,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,mBAAmB,CAsBpD,CAAC"}
@@ -0,0 +1,222 @@
1
+ import { cloneImageData } from "../pixel.js";
2
+ function clamp01(value) {
3
+ return value < 0 ? 0 : value > 1 ? 1 : value;
4
+ }
5
+ function lerp(from, to, amount) {
6
+ return from + (to - from) * amount;
7
+ }
8
+ function gaussianKernel(sigma) {
9
+ const radius = Math.max(1, Math.ceil(sigma * 3));
10
+ const kernel = new Float64Array(radius * 2 + 1);
11
+ let sum = 0;
12
+ for (let i = -radius; i <= radius; i++) {
13
+ const weight = Math.exp(-(i * i) / (2 * sigma * sigma));
14
+ kernel[i + radius] = weight;
15
+ sum += weight;
16
+ }
17
+ for (let i = 0; i < kernel.length; i++)
18
+ kernel[i] = (kernel[i] ?? 0) / sum;
19
+ return kernel;
20
+ }
21
+ /**
22
+ * Separable Gaussian blur over premultiplied RGBA, clamping at the borders.
23
+ * Premultiplying means a transparent pixel's colour never bleeds into its
24
+ * opaque neighbours, so cutouts blur cleanly. Returns un-premultiplied bytes.
25
+ */
26
+ function blurRgba(image, sigma) {
27
+ const { width, height, data } = image;
28
+ const kernel = gaussianKernel(sigma);
29
+ const radius = (kernel.length - 1) / 2;
30
+ const count = width * height;
31
+ let current = new Float32Array(count * 4);
32
+ for (let p = 0; p < count; p++) {
33
+ const alpha = (data[p * 4 + 3] ?? 0) / 255;
34
+ current[p * 4] = (data[p * 4] ?? 0) * alpha;
35
+ current[p * 4 + 1] = (data[p * 4 + 1] ?? 0) * alpha;
36
+ current[p * 4 + 2] = (data[p * 4 + 2] ?? 0) * alpha;
37
+ current[p * 4 + 3] = alpha * 255;
38
+ }
39
+ for (const horizontal of [true, false]) {
40
+ const next = new Float32Array(count * 4);
41
+ for (let y = 0; y < height; y++) {
42
+ for (let x = 0; x < width; x++) {
43
+ let r = 0;
44
+ let g = 0;
45
+ let b = 0;
46
+ let a = 0;
47
+ for (let k = -radius; k <= radius; k++) {
48
+ const sx = horizontal ? Math.min(width - 1, Math.max(0, x + k)) : x;
49
+ const sy = horizontal ? y : Math.min(height - 1, Math.max(0, y + k));
50
+ const weight = kernel[k + radius] ?? 0;
51
+ const i = (sy * width + sx) * 4;
52
+ r += (current[i] ?? 0) * weight;
53
+ g += (current[i + 1] ?? 0) * weight;
54
+ b += (current[i + 2] ?? 0) * weight;
55
+ a += (current[i + 3] ?? 0) * weight;
56
+ }
57
+ const o = (y * width + x) * 4;
58
+ next[o] = r;
59
+ next[o + 1] = g;
60
+ next[o + 2] = b;
61
+ next[o + 3] = a;
62
+ }
63
+ }
64
+ current = next;
65
+ }
66
+ const output = new Uint8ClampedArray(new ArrayBuffer(count * 4));
67
+ for (let p = 0; p < count; p++) {
68
+ const alpha = (current[p * 4 + 3] ?? 0) / 255;
69
+ const scale = alpha > 0 ? 1 / alpha : 0;
70
+ output[p * 4] = (current[p * 4] ?? 0) * scale;
71
+ output[p * 4 + 1] = (current[p * 4 + 1] ?? 0) * scale;
72
+ output[p * 4 + 2] = (current[p * 4 + 2] ?? 0) * scale;
73
+ output[p * 4 + 3] = alpha * 255;
74
+ }
75
+ return output;
76
+ }
77
+ /** Gaussian blur: the standard bell-shaped falloff, ideal for soft defocus. */
78
+ export const gaussianBlur = (image, options) => {
79
+ const sigma = options.sigma ?? 2;
80
+ if (!(sigma > 0))
81
+ return cloneImageData(image);
82
+ return new ImageData(blurRgba(image, sigma), image.width, image.height);
83
+ };
84
+ /**
85
+ * High pass: the image minus a blurred copy, centred on mid-grey, which keeps
86
+ * edges and fine detail and drops the broad tones. Alpha is left as it was.
87
+ */
88
+ export const highPass = (image, options) => {
89
+ const sigma = options.sigma ?? 3;
90
+ const amount = options.amount ?? 1;
91
+ const output = cloneImageData(image);
92
+ const blurred = sigma > 0 ? blurRgba(image, sigma) : null;
93
+ const data = output.data;
94
+ for (let i = 0; i < data.length; i += 4) {
95
+ for (let c = 0; c < 3; c++) {
96
+ const original = data[i + c] ?? 0;
97
+ const base = blurred ? (blurred[i + c] ?? 0) : original;
98
+ data[i + c] = 128 + (original - base) * amount;
99
+ }
100
+ }
101
+ return output;
102
+ };
103
+ /** Classic sepia tone for an antique-photograph look. */
104
+ export const sepia = (image, options) => {
105
+ const amount = clamp01(options.amount ?? 1);
106
+ const output = cloneImageData(image);
107
+ const data = output.data;
108
+ for (let i = 0; i < data.length; i += 4) {
109
+ const r = data[i] ?? 0;
110
+ const g = data[i + 1] ?? 0;
111
+ const b = data[i + 2] ?? 0;
112
+ const sr = r * 0.393 + g * 0.769 + b * 0.189;
113
+ const sg = r * 0.349 + g * 0.686 + b * 0.168;
114
+ const sb = r * 0.272 + g * 0.534 + b * 0.131;
115
+ data[i] = lerp(r, sr, amount);
116
+ data[i + 1] = lerp(g, sg, amount);
117
+ data[i + 2] = lerp(b, sb, amount);
118
+ }
119
+ return output;
120
+ };
121
+ /** Makes semi-transparent pixels fully opaque or fully transparent, for crisp sticker-style cutouts. */
122
+ export const alphaThreshold = (image, options) => {
123
+ const threshold = options.threshold ?? 128;
124
+ const output = cloneImageData(image);
125
+ const data = output.data;
126
+ for (let i = 3; i < data.length; i += 4) {
127
+ data[i] = (data[i] ?? 0) >= threshold ? 255 : 0;
128
+ }
129
+ return output;
130
+ };
131
+ /** Reduces the image to large flat blocks, each the average of the pixels it covers. */
132
+ export const pixelate = (image, options) => {
133
+ const block = Math.max(1, Math.round(options.blockSize ?? 8));
134
+ const output = cloneImageData(image);
135
+ if (block === 1)
136
+ return output;
137
+ const { width, height } = image;
138
+ const source = image.data;
139
+ const data = output.data;
140
+ for (let by = 0; by < height; by += block) {
141
+ for (let bx = 0; bx < width; bx += block) {
142
+ const endY = Math.min(height, by + block);
143
+ const endX = Math.min(width, bx + block);
144
+ let r = 0;
145
+ let g = 0;
146
+ let b = 0;
147
+ let a = 0;
148
+ for (let y = by; y < endY; y++) {
149
+ for (let x = bx; x < endX; x++) {
150
+ const i = (y * width + x) * 4;
151
+ const alpha = source[i + 3] ?? 0;
152
+ r += (source[i] ?? 0) * alpha;
153
+ g += (source[i + 1] ?? 0) * alpha;
154
+ b += (source[i + 2] ?? 0) * alpha;
155
+ a += alpha;
156
+ }
157
+ }
158
+ const pixels = (endY - by) * (endX - bx);
159
+ const scale = a > 0 ? 1 / a : 0;
160
+ const fill = [r * scale, g * scale, b * scale, a / pixels];
161
+ for (let y = by; y < endY; y++) {
162
+ for (let x = bx; x < endX; x++) {
163
+ const i = (y * width + x) * 4;
164
+ data[i] = fill[0] ?? 0;
165
+ data[i + 1] = fill[1] ?? 0;
166
+ data[i + 2] = fill[2] ?? 0;
167
+ data[i + 3] = fill[3] ?? 0;
168
+ }
169
+ }
170
+ }
171
+ }
172
+ return output;
173
+ };
174
+ /** Maps brightness onto a two-colour gradient, for a graphic poster or branding look. */
175
+ export const duotone = (image, options) => {
176
+ const shadow = options.shadow ?? [25, 25, 112];
177
+ const highlight = options.highlight ?? [255, 214, 140];
178
+ const output = cloneImageData(image);
179
+ const data = output.data;
180
+ for (let i = 0; i < data.length; i += 4) {
181
+ const luminance = ((data[i] ?? 0) * 0.299 + (data[i + 1] ?? 0) * 0.587 + (data[i + 2] ?? 0) * 0.114) / 255;
182
+ data[i] = lerp(shadow[0], highlight[0], luminance);
183
+ data[i + 1] = lerp(shadow[1], highlight[1], luminance);
184
+ data[i + 2] = lerp(shadow[2], highlight[2], luminance);
185
+ }
186
+ return output;
187
+ };
188
+ /** Smooth S-curve on 0-1 with `contrast` > 1 steepening the middle. */
189
+ function sCurve(value, contrast) {
190
+ const centred = value * 2 - 1;
191
+ const shaped = Math.sign(centred) * Math.pow(Math.abs(centred), 1 / contrast);
192
+ return (shaped + 1) / 2;
193
+ }
194
+ /**
195
+ * Cross process: the vivid, colour-shifted look of film developed in the
196
+ * wrong chemicals. Red gains contrast, green a little, and blue is lifted in
197
+ * the shadows and held back in the highlights.
198
+ */
199
+ export const crossProcess = (image, options) => {
200
+ const strength = clamp01(options.strength ?? 1);
201
+ const redLut = new Float32Array(256);
202
+ const greenLut = new Float32Array(256);
203
+ const blueLut = new Float32Array(256);
204
+ for (let v = 0; v < 256; v++) {
205
+ const unit = v / 255;
206
+ redLut[v] = sCurve(unit, 1.6) * 255;
207
+ greenLut[v] = sCurve(unit, 1.2) * 255;
208
+ blueLut[v] = (0.16 + unit * 0.68) * 255;
209
+ }
210
+ const output = cloneImageData(image);
211
+ const data = output.data;
212
+ for (let i = 0; i < data.length; i += 4) {
213
+ const r = data[i] ?? 0;
214
+ const g = data[i + 1] ?? 0;
215
+ const b = data[i + 2] ?? 0;
216
+ data[i] = lerp(r, redLut[r] ?? r, strength);
217
+ data[i + 1] = lerp(g, greenLut[g] ?? g, strength);
218
+ data[i + 2] = lerp(b, blueLut[b] ?? b, strength);
219
+ }
220
+ return output;
221
+ };
222
+ //# sourceMappingURL=effects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"effects.js","sourceRoot":"","sources":["../../src/filters/effects.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,8 @@ export * from "./tone.js";
4
4
  export * from "./dither.js";
5
5
  export * from "./edge-morphology.js";
6
6
  export * from "./transform.js";
7
+ export * from "./effects.js";
8
+ export * from "./stylize.js";
7
9
  export * from "./testgrid.js";
8
10
  /**
9
11
  * Display metadata for a built-in filter, used to drive a generic filter-list
@@ -14,7 +16,7 @@ export * from "./testgrid.js";
14
16
  export interface BuiltInFilterEntry {
15
17
  name: string;
16
18
  label: string;
17
- group: "Tone" | "Dither" | "Edges & Morphology" | "Transform";
19
+ group: "Tone" | "Dither" | "Edges & Morphology" | "Effects" | "Transform";
18
20
  filter: Filter<never>;
19
21
  }
20
22
  export declare const BUILT_IN_FILTERS: readonly BuiltInFilterEntry[];
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/filters/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAuBrD,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC;AACrC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAE9B;;;;;GAKG;AACH,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,oBAAoB,GAAG,WAAW,CAAC;IAC9D,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;CACvB;AAED,eAAO,MAAM,gBAAgB,EAAE,SAAS,kBAAkB,EAwGzD,CAAC;AAEF;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI,CAKrE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/filters/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAkCrD,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC;AACrC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAE9B;;;;;GAKG;AACH,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,oBAAoB,GAAG,SAAS,GAAG,WAAW,CAAC;IAC1E,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;CACvB;AAED,eAAO,MAAM,gBAAgB,EAAE,SAAS,kBAAkB,EAwIzD,CAAC;AAEF;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI,CAKrE"}
@@ -1,11 +1,15 @@
1
1
  import { grayscale, levels, curves, brightnessContrast, adjustGamma } from "./tone.js";
2
- import { ditherFloydSteinberg, ditherAtkinson, ditherJarvisJudiceNinke, ditherStucki, ditherSierra, ditherBurkes, ditherBayer, ditherBlueNoise, } from "./dither.js";
2
+ import { ditherFloydSteinberg, ditherAtkinson, ditherJarvisJudiceNinke, ditherStucki, ditherSierra, ditherTwoRowSierra, ditherBurkes, ditherBayer, ditherBlueNoise, } from "./dither.js";
3
3
  import { halftone, erode, dilate, morphOpen, morphClose, sobelEdgeDetect, cannyEdgeDetect, } from "./edge-morphology.js";
4
4
  import { crop, rotate, resize } from "./transform.js";
5
+ import { gaussianBlur, highPass, sepia, alphaThreshold, pixelate, duotone, crossProcess, } from "./effects.js";
6
+ import { outline, comic, stipple, colorLut } from "./stylize.js";
5
7
  export * from "./tone.js";
6
8
  export * from "./dither.js";
7
9
  export * from "./edge-morphology.js";
8
10
  export * from "./transform.js";
11
+ export * from "./effects.js";
12
+ export * from "./stylize.js";
9
13
  export * from "./testgrid.js";
10
14
  export const BUILT_IN_FILTERS = [
11
15
  { name: "grayscale", label: "Grayscale", group: "Tone", filter: grayscale },
@@ -48,6 +52,12 @@ export const BUILT_IN_FILTERS = [
48
52
  group: "Dither",
49
53
  filter: ditherSierra,
50
54
  },
55
+ {
56
+ name: "dither-two-row-sierra",
57
+ label: "Dither: Two-Row Sierra",
58
+ group: "Dither",
59
+ filter: ditherTwoRowSierra,
60
+ },
51
61
  {
52
62
  name: "dither-burkes",
53
63
  label: "Dither: Burkes",
@@ -103,6 +113,32 @@ export const BUILT_IN_FILTERS = [
103
113
  group: "Edges & Morphology",
104
114
  filter: morphClose,
105
115
  },
116
+ {
117
+ name: "gaussian-blur",
118
+ label: "Gaussian Blur",
119
+ group: "Effects",
120
+ filter: gaussianBlur,
121
+ },
122
+ { name: "high-pass", label: "High Pass", group: "Effects", filter: highPass },
123
+ { name: "sepia", label: "Sepia", group: "Effects", filter: sepia },
124
+ {
125
+ name: "alpha-threshold",
126
+ label: "Alpha Threshold",
127
+ group: "Effects",
128
+ filter: alphaThreshold,
129
+ },
130
+ { name: "pixelate", label: "Pixelate", group: "Effects", filter: pixelate },
131
+ { name: "duotone", label: "Duotone", group: "Effects", filter: duotone },
132
+ {
133
+ name: "cross-process",
134
+ label: "Cross Process",
135
+ group: "Effects",
136
+ filter: crossProcess,
137
+ },
138
+ { name: "outline", label: "Outline", group: "Effects", filter: outline },
139
+ { name: "comic", label: "Comic", group: "Effects", filter: comic },
140
+ { name: "stipple", label: "Stipple", group: "Effects", filter: stipple },
141
+ { name: "color-lut", label: "Color LUT", group: "Effects", filter: colorLut },
106
142
  { name: "crop", label: "Crop (full image)", group: "Transform", filter: crop },
107
143
  { name: "rotate", label: "Rotate 90°", group: "Transform", filter: rotate },
108
144
  {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/filters/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/filters/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,79 @@
1
+ import type { Filter, FilterOptions } from "../types.js";
2
+ import type { Rgb } from "./effects.js";
3
+ export interface OutlineOptions extends FilterOptions {
4
+ /** Edge strength (0-255) a pixel needs to be drawn as a line. Lower finds more edges. Default 30. */
5
+ threshold?: number;
6
+ /** Line thickness in pixels (at least 1). Default 1. */
7
+ width?: number;
8
+ /** Line colour. Default black. */
9
+ color?: Rgb;
10
+ /** Line opacity, 0-1. Default 1. */
11
+ opacity?: number;
12
+ /** What the lines are drawn on: the picture itself, plain white, or nothing (transparent). Default "image". */
13
+ background?: "image" | "white" | "transparent";
14
+ }
15
+ /**
16
+ * Draws coloured lines along the picture's edges, from subtle outlines to
17
+ * comic-style contours. The boundary of a transparent cutout counts as an
18
+ * edge, so a cutout gets a sticker-style outline.
19
+ */
20
+ export declare const outline: Filter<OutlineOptions>;
21
+ export interface ComicOptions extends FilterOptions {
22
+ /** Colour levels per channel after posterizing (2-16). Default 4. */
23
+ levels?: number;
24
+ /** Edge strength (0-255) a pixel needs to be inked. Default 40. */
25
+ edgeThreshold?: number;
26
+ /** Ink line thickness in pixels (at least 1). Default 2. */
27
+ lineWidth?: number;
28
+ /** Ink colour. Default black. */
29
+ ink?: Rgb;
30
+ }
31
+ /** Turns a photo into a cartoon illustration: posterized flat colour with ink outlines. */
32
+ export declare const comic: Filter<ComicOptions>;
33
+ export interface StippleOptions extends FilterOptions {
34
+ /** Side in pixels of the cells the picture is sampled in. Default 6. */
35
+ cellSize?: number;
36
+ /** Dot radius in pixels. Default 0.8. */
37
+ dotRadius?: number;
38
+ /** Multiplier on how many dots are drawn. Default 1. */
39
+ density?: number;
40
+ /** Seed for the dot positions; the same seed gives the same picture. Default 1. */
41
+ seed?: number;
42
+ /** Dot colour. Default black. */
43
+ ink?: Rgb;
44
+ /** Paper colour. Default white. */
45
+ paper?: Rgb;
46
+ }
47
+ /**
48
+ * Stipple: renders tone as scattered dots, denser where the picture is darker,
49
+ * like a traditional stippling illustration. Transparent pixels stay empty.
50
+ */
51
+ export declare const stipple: Filter<StippleOptions>;
52
+ /**
53
+ * A 3D colour look-up table: `size`³ output colours (each channel 0-1), stored
54
+ * red-fastest then green then blue, the order of an Adobe `.cube` file.
55
+ */
56
+ export interface ColorLut {
57
+ size: number;
58
+ data: Float32Array;
59
+ }
60
+ /** Builds a LUT by evaluating `transform` (0-1 in, 0-1 out per channel) at each grid point. */
61
+ export declare function createColorLut(size: number, transform: (r: number, g: number, b: number) => Rgb): ColorLut;
62
+ /** Parses an Adobe/Resolve `.cube` 3D LUT. Throws an Error naming the problem if it can't be read. */
63
+ export declare function parseCubeLut(text: string): ColorLut;
64
+ export type LutPresetName = "teal-orange" | "warm-film" | "cool" | "noir" | "vivid";
65
+ /** Names of the built-in LUT looks, in display order. */
66
+ export declare const LUT_PRESET_NAMES: readonly LutPresetName[];
67
+ /** Returns the built-in LUT for a preset look (built once, then cached). */
68
+ export declare function getLutPreset(name: LutPresetName): ColorLut;
69
+ export interface ColorLutOptions extends FilterOptions {
70
+ /** A LUT to apply (for example from {@link parseCubeLut}). Takes priority over `preset`. */
71
+ lut?: ColorLut;
72
+ /** A built-in look to apply when no `lut` is given. Default "teal-orange". */
73
+ preset?: LutPresetName;
74
+ /** 0 = unchanged, 1 = full effect. Default 1. */
75
+ strength?: number;
76
+ }
77
+ /** Applies a 3D colour LUT (a built-in look or a loaded `.cube`) for one-click colour grading. */
78
+ export declare const colorLut: Filter<ColorLutOptions>;
79
+ //# sourceMappingURL=stylize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stylize.d.ts","sourceRoot":"","sources":["../../src/filters/stylize.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEzD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAiGxC,MAAM,WAAW,cAAe,SAAQ,aAAa;IACnD,qGAAqG;IACrG,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wDAAwD;IACxD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kCAAkC;IAClC,KAAK,CAAC,EAAE,GAAG,CAAC;IACZ,oCAAoC;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,+GAA+G;IAC/G,UAAU,CAAC,EAAE,OAAO,GAAG,OAAO,GAAG,aAAa,CAAC;CAChD;AAED;;;;GAIG;AACH,eAAO,MAAM,OAAO,EAAE,MAAM,CAAC,cAAc,CA4B1C,CAAC;AAEF,MAAM,WAAW,YAAa,SAAQ,aAAa;IACjD,qEAAqE;IACrE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mEAAmE;IACnE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,4DAA4D;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iCAAiC;IACjC,GAAG,CAAC,EAAE,GAAG,CAAC;CACX;AAED,2FAA2F;AAC3F,eAAO,MAAM,KAAK,EAAE,MAAM,CAAC,YAAY,CAoBtC,CAAC;AAEF,MAAM,WAAW,cAAe,SAAQ,aAAa;IACnD,wEAAwE;IACxE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yCAAyC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wDAAwD;IACxD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mFAAmF;IACnF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iCAAiC;IACjC,GAAG,CAAC,EAAE,GAAG,CAAC;IACV,mCAAmC;IACnC,KAAK,CAAC,EAAE,GAAG,CAAC;CACb;AAED;;;GAGG;AACH,eAAO,MAAM,OAAO,EAAE,MAAM,CAAC,cAAc,CA0D1C,CAAC;AAEF;;;GAGG;AACH,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,YAAY,CAAC;CACpB;AAED,+FAA+F;AAC/F,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,GAAG,GAClD,QAAQ,CAcV;AAED,sGAAsG;AACtG,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CA8CnD;AA4BD,MAAM,MAAM,aAAa,GAAG,aAAa,GAAG,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AA0BpF,yDAAyD;AACzD,eAAO,MAAM,gBAAgB,EAAE,SAAS,aAAa,EAMpD,CAAC;AAIF,4EAA4E;AAC5E,wBAAgB,YAAY,CAAC,IAAI,EAAE,aAAa,GAAG,QAAQ,CAO1D;AAED,MAAM,WAAW,eAAgB,SAAQ,aAAa;IACpD,4FAA4F;IAC5F,GAAG,CAAC,EAAE,QAAQ,CAAC;IACf,8EAA8E;IAC9E,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,iDAAiD;IACjD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,kGAAkG;AAClG,eAAO,MAAM,QAAQ,EAAE,MAAM,CAAC,eAAe,CAe5C,CAAC"}
@@ -0,0 +1,362 @@
1
+ import { cloneImageData } from "../pixel.js";
2
+ function clamp01(value) {
3
+ return value < 0 ? 0 : value > 1 ? 1 : value;
4
+ }
5
+ function lerp(from, to, amount) {
6
+ return from + (to - from) * amount;
7
+ }
8
+ function luma(r, g, b) {
9
+ return r * 0.299 + g * 0.587 + b * 0.114;
10
+ }
11
+ /** Small seeded PRNG (mulberry32) so a seed always gives the same picture. */
12
+ function createRandom(seed) {
13
+ let state = seed >>> 0;
14
+ return () => {
15
+ state = (state + 0x6d2b79f5) >>> 0;
16
+ let t = state;
17
+ t = Math.imul(t ^ (t >>> 15), t | 1);
18
+ t ^= t + Math.imul(t ^ (t >>> 7), t | 61);
19
+ return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
20
+ };
21
+ }
22
+ /**
23
+ * Edge strength per pixel, 0-255: the larger of the Sobel gradient of the
24
+ * luminance (over the picture's own colours, scaled by its alpha) and of the
25
+ * alpha channel, so both detail and the outline of a cutout count.
26
+ */
27
+ function edgeStrength(image) {
28
+ const { width, height, data } = image;
29
+ const tone = new Float32Array(width * height);
30
+ const alpha = new Float32Array(width * height);
31
+ for (let p = 0; p < tone.length; p++) {
32
+ const a = (data[p * 4 + 3] ?? 0) / 255;
33
+ tone[p] = luma(data[p * 4] ?? 0, data[p * 4 + 1] ?? 0, data[p * 4 + 2] ?? 0) * a;
34
+ alpha[p] = a * 255;
35
+ }
36
+ const strength = new Float32Array(width * height);
37
+ const sample = (buffer, x, y) => buffer[Math.min(height - 1, Math.max(0, y)) * width + Math.min(width - 1, Math.max(0, x))] ?? 0;
38
+ const gradient = (buffer, x, y) => {
39
+ const gx = -sample(buffer, x - 1, y - 1) -
40
+ 2 * sample(buffer, x - 1, y) -
41
+ sample(buffer, x - 1, y + 1) +
42
+ sample(buffer, x + 1, y - 1) +
43
+ 2 * sample(buffer, x + 1, y) +
44
+ sample(buffer, x + 1, y + 1);
45
+ const gy = -sample(buffer, x - 1, y - 1) -
46
+ 2 * sample(buffer, x, y - 1) -
47
+ sample(buffer, x + 1, y - 1) +
48
+ sample(buffer, x - 1, y + 1) +
49
+ 2 * sample(buffer, x, y + 1) +
50
+ sample(buffer, x + 1, y + 1);
51
+ return Math.hypot(gx, gy) / 4;
52
+ };
53
+ for (let y = 0; y < height; y++) {
54
+ for (let x = 0; x < width; x++) {
55
+ strength[y * width + x] = Math.max(gradient(tone, x, y), gradient(alpha, x, y));
56
+ }
57
+ }
58
+ return strength;
59
+ }
60
+ /** Marks pixels whose edge strength reaches `threshold`, then thickens the lines to `width` px. */
61
+ function edgeMask(image, threshold, width) {
62
+ const strength = edgeStrength(image);
63
+ const mask = new Uint8Array(strength.length);
64
+ for (let p = 0; p < strength.length; p++)
65
+ mask[p] = (strength[p] ?? 0) >= threshold ? 1 : 0;
66
+ const grow = Math.max(0, Math.round(width) - 1);
67
+ if (grow === 0)
68
+ return mask;
69
+ const { width: w, height: h } = image;
70
+ let current = mask;
71
+ for (let pass = 0; pass < grow; pass++) {
72
+ const next = current.slice();
73
+ for (let y = 0; y < h; y++) {
74
+ for (let x = 0; x < w; x++) {
75
+ if (current[y * w + x])
76
+ continue;
77
+ if ((x > 0 && current[y * w + x - 1]) ||
78
+ (x < w - 1 && current[y * w + x + 1]) ||
79
+ (y > 0 && current[(y - 1) * w + x]) ||
80
+ (y < h - 1 && current[(y + 1) * w + x])) {
81
+ next[y * w + x] = 1;
82
+ }
83
+ }
84
+ }
85
+ current = next;
86
+ }
87
+ return current;
88
+ }
89
+ /**
90
+ * Draws coloured lines along the picture's edges, from subtle outlines to
91
+ * comic-style contours. The boundary of a transparent cutout counts as an
92
+ * edge, so a cutout gets a sticker-style outline.
93
+ */
94
+ export const outline = (image, options) => {
95
+ const threshold = options.threshold ?? 30;
96
+ const color = options.color ?? [0, 0, 0];
97
+ const opacity = clamp01(options.opacity ?? 1);
98
+ const background = options.background ?? "image";
99
+ const mask = edgeMask(image, threshold, options.width ?? 1);
100
+ const output = cloneImageData(image);
101
+ const data = output.data;
102
+ for (let p = 0; p < mask.length; p++) {
103
+ const i = p * 4;
104
+ if (background === "white") {
105
+ data[i] = 255;
106
+ data[i + 1] = 255;
107
+ data[i + 2] = 255;
108
+ data[i + 3] = 255;
109
+ }
110
+ else if (background === "transparent") {
111
+ data[i + 3] = 0;
112
+ }
113
+ if (!mask[p])
114
+ continue;
115
+ const currentAlpha = data[i + 3] ?? 0;
116
+ const lineAlpha = opacity * 255;
117
+ const visible = currentAlpha > 0;
118
+ data[i] = visible ? lerp(data[i] ?? 0, color[0], opacity) : color[0];
119
+ data[i + 1] = visible ? lerp(data[i + 1] ?? 0, color[1], opacity) : color[1];
120
+ data[i + 2] = visible ? lerp(data[i + 2] ?? 0, color[2], opacity) : color[2];
121
+ data[i + 3] = Math.max(currentAlpha, lineAlpha);
122
+ }
123
+ return output;
124
+ };
125
+ /** Turns a photo into a cartoon illustration: posterized flat colour with ink outlines. */
126
+ export const comic = (image, options) => {
127
+ const levels = Math.min(16, Math.max(2, Math.round(options.levels ?? 4)));
128
+ const ink = options.ink ?? [0, 0, 0];
129
+ const mask = edgeMask(image, options.edgeThreshold ?? 40, options.lineWidth ?? 2);
130
+ const output = cloneImageData(image);
131
+ const data = output.data;
132
+ const step = 255 / (levels - 1);
133
+ for (let p = 0; p < mask.length; p++) {
134
+ const i = p * 4;
135
+ if (mask[p]) {
136
+ data[i] = ink[0];
137
+ data[i + 1] = ink[1];
138
+ data[i + 2] = ink[2];
139
+ continue;
140
+ }
141
+ for (let c = 0; c < 3; c++) {
142
+ data[i + c] = Math.round((data[i + c] ?? 0) / step) * step;
143
+ }
144
+ }
145
+ return output;
146
+ };
147
+ /**
148
+ * Stipple: renders tone as scattered dots, denser where the picture is darker,
149
+ * like a traditional stippling illustration. Transparent pixels stay empty.
150
+ */
151
+ export const stipple = (image, options) => {
152
+ const cell = Math.max(2, Math.round(options.cellSize ?? 6));
153
+ const radius = Math.max(0.3, options.dotRadius ?? 0.8);
154
+ const density = Math.max(0, options.density ?? 1);
155
+ const ink = options.ink ?? [0, 0, 0];
156
+ const paper = options.paper ?? [255, 255, 255];
157
+ const random = createRandom(options.seed ?? 1);
158
+ const { width, height, data: source } = image;
159
+ const output = cloneImageData(image);
160
+ const data = output.data;
161
+ for (let i = 0; i < data.length; i += 4) {
162
+ data[i] = paper[0];
163
+ data[i + 1] = paper[1];
164
+ data[i + 2] = paper[2];
165
+ }
166
+ const dotArea = Math.PI * radius * radius;
167
+ for (let cy = 0; cy < height; cy += cell) {
168
+ for (let cx = 0; cx < width; cx += cell) {
169
+ const endX = Math.min(width, cx + cell);
170
+ const endY = Math.min(height, cy + cell);
171
+ let tone = 0;
172
+ let weight = 0;
173
+ for (let y = cy; y < endY; y++) {
174
+ for (let x = cx; x < endX; x++) {
175
+ const i = (y * width + x) * 4;
176
+ const alpha = (source[i + 3] ?? 0) / 255;
177
+ tone += luma(source[i] ?? 0, source[i + 1] ?? 0, source[i + 2] ?? 0) * alpha;
178
+ weight += alpha;
179
+ }
180
+ }
181
+ if (weight === 0)
182
+ continue;
183
+ const darkness = 1 - tone / weight / 255;
184
+ const expected = (darkness * density * (endX - cx) * (endY - cy) * 0.5) / dotArea;
185
+ let dots = Math.floor(expected);
186
+ if (random() < expected - dots)
187
+ dots++;
188
+ for (let d = 0; d < dots; d++) {
189
+ const dx = cx + random() * (endX - cx);
190
+ const dy = cy + random() * (endY - cy);
191
+ const minX = Math.max(0, Math.floor(dx - radius));
192
+ const maxX = Math.min(width - 1, Math.ceil(dx + radius));
193
+ const minY = Math.max(0, Math.floor(dy - radius));
194
+ const maxY = Math.min(height - 1, Math.ceil(dy + radius));
195
+ for (let y = minY; y <= maxY; y++) {
196
+ for (let x = minX; x <= maxX; x++) {
197
+ if (Math.hypot(x + 0.5 - dx, y + 0.5 - dy) > radius)
198
+ continue;
199
+ const i = (y * width + x) * 4;
200
+ if ((source[i + 3] ?? 0) === 0)
201
+ continue;
202
+ data[i] = ink[0];
203
+ data[i + 1] = ink[1];
204
+ data[i + 2] = ink[2];
205
+ }
206
+ }
207
+ }
208
+ }
209
+ }
210
+ return output;
211
+ };
212
+ /** Builds a LUT by evaluating `transform` (0-1 in, 0-1 out per channel) at each grid point. */
213
+ export function createColorLut(size, transform) {
214
+ const data = new Float32Array(size * size * size * 3);
215
+ let index = 0;
216
+ for (let b = 0; b < size; b++) {
217
+ for (let g = 0; g < size; g++) {
218
+ for (let r = 0; r < size; r++) {
219
+ const [or, og, ob] = transform(r / (size - 1), g / (size - 1), b / (size - 1));
220
+ data[index++] = clamp01(or);
221
+ data[index++] = clamp01(og);
222
+ data[index++] = clamp01(ob);
223
+ }
224
+ }
225
+ }
226
+ return { size, data };
227
+ }
228
+ /** Parses an Adobe/Resolve `.cube` 3D LUT. Throws an Error naming the problem if it can't be read. */
229
+ export function parseCubeLut(text) {
230
+ let size = 0;
231
+ let domainMin = [0, 0, 0];
232
+ let domainMax = [1, 1, 1];
233
+ const values = [];
234
+ for (const rawLine of text.split(/\r?\n/)) {
235
+ const line = rawLine.trim();
236
+ if (line === "" || line.startsWith("#") || line.startsWith("TITLE"))
237
+ continue;
238
+ const parts = line.split(/\s+/);
239
+ const keyword = parts[0] ?? "";
240
+ if (keyword === "LUT_3D_SIZE") {
241
+ size = Number(parts[1]);
242
+ }
243
+ else if (keyword === "LUT_1D_SIZE") {
244
+ throw new Error("1D .cube LUTs are not supported; use a 3D LUT (LUT_3D_SIZE).");
245
+ }
246
+ else if (keyword === "DOMAIN_MIN" || keyword === "DOMAIN_MAX") {
247
+ const triple = [Number(parts[1]), Number(parts[2]), Number(parts[3])];
248
+ if (triple.some((value) => !Number.isFinite(value))) {
249
+ throw new Error(`Invalid ${keyword} line in .cube LUT: "${line}".`);
250
+ }
251
+ if (keyword === "DOMAIN_MIN")
252
+ domainMin = triple;
253
+ else
254
+ domainMax = triple;
255
+ }
256
+ else if (/^[-+0-9.]/.test(keyword)) {
257
+ const triple = [Number(parts[0]), Number(parts[1]), Number(parts[2])];
258
+ if (triple.some((value) => !Number.isFinite(value))) {
259
+ throw new Error(`Invalid colour row in .cube LUT: "${line}".`);
260
+ }
261
+ values.push(...triple);
262
+ }
263
+ }
264
+ if (!Number.isInteger(size) || size < 2) {
265
+ throw new Error("The .cube LUT has no valid LUT_3D_SIZE line (an integer of at least 2).");
266
+ }
267
+ const expected = size * size * size * 3;
268
+ if (values.length !== expected) {
269
+ throw new Error(`The .cube LUT declares size ${size}, which needs ${expected / 3} colour rows, but ${values.length / 3} were found.`);
270
+ }
271
+ const data = new Float32Array(expected);
272
+ for (let i = 0; i < expected; i++) {
273
+ const channel = i % 3;
274
+ const min = domainMin[channel] ?? 0;
275
+ const max = domainMax[channel] ?? 1;
276
+ data[i] = clamp01(((values[i] ?? 0) - min) / (max - min || 1));
277
+ }
278
+ return { size, data };
279
+ }
280
+ /** Looks up (r, g, b) in `lut` (all 0-1) with trilinear interpolation. */
281
+ function sampleLut(lut, r, g, b) {
282
+ const { size, data } = lut;
283
+ const top = size - 1;
284
+ const fr = clamp01(r) * top;
285
+ const fg = clamp01(g) * top;
286
+ const fb = clamp01(b) * top;
287
+ const r0 = Math.min(top - 1, Math.floor(fr));
288
+ const g0 = Math.min(top - 1, Math.floor(fg));
289
+ const b0 = Math.min(top - 1, Math.floor(fb));
290
+ const tr = fr - r0;
291
+ const tg = fg - g0;
292
+ const tb = fb - b0;
293
+ const at = (ri, gi, bi, channel) => data[((bi * size + gi) * size + ri) * 3 + channel] ?? 0;
294
+ const out = [0, 0, 0];
295
+ for (let c = 0; c < 3; c++) {
296
+ const c00 = lerp(at(r0, g0, b0, c), at(r0 + 1, g0, b0, c), tr);
297
+ const c10 = lerp(at(r0, g0 + 1, b0, c), at(r0 + 1, g0 + 1, b0, c), tr);
298
+ const c01 = lerp(at(r0, g0, b0 + 1, c), at(r0 + 1, g0, b0 + 1, c), tr);
299
+ const c11 = lerp(at(r0, g0 + 1, b0 + 1, c), at(r0 + 1, g0 + 1, b0 + 1, c), tr);
300
+ out[c] = lerp(lerp(c00, c10, tg), lerp(c01, c11, tg), tb);
301
+ }
302
+ return out;
303
+ }
304
+ /** The built-in grading looks, each a function of 0-1 colour. */
305
+ const LUT_PRESET_TRANSFORMS = {
306
+ "teal-orange": (r, g, b) => {
307
+ const light = luma(r, g, b);
308
+ const shadow = 1 - light;
309
+ return [
310
+ r + 0.1 * light - 0.08 * shadow,
311
+ g + 0.02 * light + 0.02 * shadow,
312
+ b - 0.1 * light + 0.1 * shadow,
313
+ ];
314
+ },
315
+ "warm-film": (r, g, b) => [0.06 + r * 0.9 + 0.03, 0.05 + g * 0.88, 0.05 + b * 0.78],
316
+ cool: (r, g, b) => [r * 0.94, g * 0.99 + 0.01, b * 1.0 + 0.06],
317
+ noir: (r, g, b) => {
318
+ const light = luma(r, g, b);
319
+ const curved = light < 0.5 ? 2 * light * light : 1 - 2 * (1 - light) * (1 - light);
320
+ return [curved, curved, curved];
321
+ },
322
+ vivid: (r, g, b) => {
323
+ const light = luma(r, g, b);
324
+ return [light + (r - light) * 1.4, light + (g - light) * 1.4, light + (b - light) * 1.4];
325
+ },
326
+ };
327
+ /** Names of the built-in LUT looks, in display order. */
328
+ export const LUT_PRESET_NAMES = [
329
+ "teal-orange",
330
+ "warm-film",
331
+ "cool",
332
+ "noir",
333
+ "vivid",
334
+ ];
335
+ const presetCache = new Map();
336
+ /** Returns the built-in LUT for a preset look (built once, then cached). */
337
+ export function getLutPreset(name) {
338
+ let lut = presetCache.get(name);
339
+ if (!lut) {
340
+ lut = createColorLut(17, LUT_PRESET_TRANSFORMS[name]);
341
+ presetCache.set(name, lut);
342
+ }
343
+ return lut;
344
+ }
345
+ /** Applies a 3D colour LUT (a built-in look or a loaded `.cube`) for one-click colour grading. */
346
+ export const colorLut = (image, options) => {
347
+ const lut = options.lut ?? getLutPreset(options.preset ?? "teal-orange");
348
+ const strength = clamp01(options.strength ?? 1);
349
+ const output = cloneImageData(image);
350
+ const data = output.data;
351
+ for (let i = 0; i < data.length; i += 4) {
352
+ const r = data[i] ?? 0;
353
+ const g = data[i + 1] ?? 0;
354
+ const b = data[i + 2] ?? 0;
355
+ const [lr, lg, lb] = sampleLut(lut, r / 255, g / 255, b / 255);
356
+ data[i] = lerp(r, lr * 255, strength);
357
+ data[i + 1] = lerp(g, lg * 255, strength);
358
+ data[i + 2] = lerp(b, lb * 255, strength);
359
+ }
360
+ return output;
361
+ };
362
+ //# sourceMappingURL=stylize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stylize.js","sourceRoot":"","sources":["../../src/filters/stylize.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@richardmcquiston01/core-image",
3
- "version": "0.3.1",
3
+ "version": "0.4.0",
4
4
  "description": "Image processing core (filters, heightmaps, pixel I/O) for laser/CNC/maker workflows",
5
5
  "keywords": [
6
6
  "image-processing",