forked from jimp-dev/jimp
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.ts
More file actions
81 lines (74 loc) · 2.09 KB
/
index.ts
File metadata and controls
81 lines (74 loc) · 2.09 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
import { JimpClass } from "@jimp/types";
import { applyPaletteSync, buildPaletteSync, utils } from "image-q";
import z from "zod";
const QuantizeOptionsSchema = z.object({
colors: z.number().optional(),
colorDistanceFormula: z
.union([
z.literal("cie94-textiles"),
z.literal("cie94-graphic-arts"),
z.literal("ciede2000"),
z.literal("color-metric"),
z.literal("euclidean"),
z.literal("euclidean-bt709-noalpha"),
z.literal("euclidean-bt709"),
z.literal("manhattan"),
z.literal("manhattan-bt709"),
z.literal("manhattan-nommyde"),
z.literal("pngquant"),
])
.optional(),
paletteQuantization: z
.union([
z.literal("neuquant"),
z.literal("neuquant-float"),
z.literal("rgbquant"),
z.literal("wuquant"),
])
.optional(),
imageQuantization: z
.union([
z.literal("nearest"),
z.literal("riemersma"),
z.literal("floyd-steinberg"),
z.literal("false-floyd-steinberg"),
z.literal("stucki"),
z.literal("atkinson"),
z.literal("jarvis"),
z.literal("burkes"),
z.literal("sierra"),
z.literal("two-sierra"),
z.literal("sierra-lite"),
])
.optional(),
});
export type QuantizeOptions = z.infer<typeof QuantizeOptionsSchema>;
export const methods = {
/**
* Image color number reduction.
*/
quantize<I extends JimpClass>(image: I, options: QuantizeOptions) {
const {
colors,
colorDistanceFormula,
paletteQuantization,
imageQuantization,
} = QuantizeOptionsSchema.parse(options);
const inPointContainer = utils.PointContainer.fromUint8Array(
new Uint8Array(image.bitmap.data.buffer),
image.bitmap.width,
image.bitmap.height
);
const palette = buildPaletteSync([inPointContainer], {
colors,
colorDistanceFormula,
paletteQuantization,
});
const outPointContainer = applyPaletteSync(inPointContainer, palette, {
colorDistanceFormula,
imageQuantization,
});
image.bitmap.data = Buffer.from(outPointContainer.toUint8Array());
return image;
},
};