image-color-grading 1.0.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 +452 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/processor.d.ts +109 -0
- package/dist/processor.d.ts.map +1 -0
- package/dist/processor.js +527 -0
- package/dist/processor.js.map +1 -0
- package/dist/shaders.d.ts +27 -0
- package/dist/shaders.d.ts.map +1 -0
- package/dist/shaders.js +674 -0
- package/dist/shaders.js.map +1 -0
- package/dist/types.d.ts +97 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +50 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +176 -0
- package/dist/utils.js.map +1 -0
- package/package.json +51 -0
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 调色设置参数
|
|
3
|
+
*/
|
|
4
|
+
export interface ColorGradingSettings {
|
|
5
|
+
/** 自然饱和度 (-100 ~ 100) */
|
|
6
|
+
vibrance: number;
|
|
7
|
+
/** 饱和度 (-100 ~ 100) */
|
|
8
|
+
saturation: number;
|
|
9
|
+
/** 色温 (-100 ~ 100) */
|
|
10
|
+
temperature: number;
|
|
11
|
+
/** 色调 (-100 ~ 100) */
|
|
12
|
+
tint: number;
|
|
13
|
+
/** 色相 (-100 ~ 100) */
|
|
14
|
+
hue: number;
|
|
15
|
+
/** 亮度 (-100 ~ 100) */
|
|
16
|
+
brightness: number;
|
|
17
|
+
/** 曝光度 (-100 ~ 100) */
|
|
18
|
+
exposure: number;
|
|
19
|
+
/** 对比度 (-100 ~ 100) */
|
|
20
|
+
contrast: number;
|
|
21
|
+
/** 黑色 (-100 ~ 100) */
|
|
22
|
+
blacks: number;
|
|
23
|
+
/** 白色 (-100 ~ 100) */
|
|
24
|
+
whites: number;
|
|
25
|
+
/** 高光 (-100 ~ 100) */
|
|
26
|
+
highlights: number;
|
|
27
|
+
/** 暗调 (-100 ~ 100) */
|
|
28
|
+
shadows: number;
|
|
29
|
+
/** 除雾化 (0 ~ 100) */
|
|
30
|
+
dehaze: number;
|
|
31
|
+
/** 泛光 (0 ~ 100) */
|
|
32
|
+
bloom: number;
|
|
33
|
+
/** 氛围美化 (0 ~ 100) */
|
|
34
|
+
glamour: number;
|
|
35
|
+
/** 清晰度 (-100 ~ 100) */
|
|
36
|
+
clarity: number;
|
|
37
|
+
/** 锐化 (0 ~ 100) */
|
|
38
|
+
sharpen: number;
|
|
39
|
+
/** 平滑 (0 ~ 100) */
|
|
40
|
+
smooth: number;
|
|
41
|
+
/** 模糊 (0 ~ 100) */
|
|
42
|
+
blur: number;
|
|
43
|
+
/** 暗角 (-100 ~ 100) */
|
|
44
|
+
vignette: number;
|
|
45
|
+
/** 颗粒 (0 ~ 100) */
|
|
46
|
+
grain: number;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* 部分调色设置参数
|
|
50
|
+
*/
|
|
51
|
+
export type PartialColorGradingSettings = Partial<ColorGradingSettings>;
|
|
52
|
+
/**
|
|
53
|
+
* WebGL 程序信息
|
|
54
|
+
*/
|
|
55
|
+
export interface ProgramInfo {
|
|
56
|
+
program: WebGLProgram;
|
|
57
|
+
attribs: {
|
|
58
|
+
aPosition: number;
|
|
59
|
+
aTexCoord: number;
|
|
60
|
+
apos: number;
|
|
61
|
+
auv: number;
|
|
62
|
+
};
|
|
63
|
+
uniforms: Record<string, WebGLUniformLocation | null>;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* 渲染目标
|
|
67
|
+
*/
|
|
68
|
+
export interface RenderTarget {
|
|
69
|
+
framebuffer: WebGLFramebuffer;
|
|
70
|
+
texture: WebGLTexture;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* WebGL 资源
|
|
74
|
+
*/
|
|
75
|
+
export interface WebGLResources {
|
|
76
|
+
gl: WebGLRenderingContext;
|
|
77
|
+
width: number;
|
|
78
|
+
height: number;
|
|
79
|
+
sourceTexture: WebGLTexture;
|
|
80
|
+
blackPalette: WebGLTexture;
|
|
81
|
+
quad: {
|
|
82
|
+
positionBuffer: WebGLBuffer;
|
|
83
|
+
texCoordBuffer: WebGLBuffer;
|
|
84
|
+
};
|
|
85
|
+
programs: Record<string, ProgramInfo>;
|
|
86
|
+
targets: [RenderTarget, RenderTarget];
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* 导出选项
|
|
90
|
+
*/
|
|
91
|
+
export interface ExportOptions {
|
|
92
|
+
/** 导出格式 */
|
|
93
|
+
format?: 'image/png' | 'image/jpeg' | 'image/webp';
|
|
94
|
+
/** JPEG/WebP 质量 (0-1) */
|
|
95
|
+
quality?: number;
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,yBAAyB;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,uBAAuB;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,sBAAsB;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,sBAAsB;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,sBAAsB;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,sBAAsB;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,uBAAuB;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,uBAAuB;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,sBAAsB;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,sBAAsB;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,sBAAsB;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,sBAAsB;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,oBAAoB;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,mBAAmB;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,qBAAqB;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,uBAAuB;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,mBAAmB;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,mBAAmB;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,mBAAmB;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,sBAAsB;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,mBAAmB;IACnB,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,MAAM,2BAA2B,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;AAExE;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,YAAY,CAAC;IACtB,OAAO,EAAE;QACP,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,IAAI,EAAE,MAAM,CAAC;QACb,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;IACF,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,GAAG,IAAI,CAAC,CAAC;CACvD;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,gBAAgB,CAAC;IAC9B,OAAO,EAAE,YAAY,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,qBAAqB,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,YAAY,CAAC;IAC5B,YAAY,EAAE,YAAY,CAAC;IAC3B,IAAI,EAAE;QACJ,cAAc,EAAE,WAAW,CAAC;QAC5B,cAAc,EAAE,WAAW,CAAC;KAC7B,CAAC;IACF,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACtC,OAAO,EAAE,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;CACvC;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,WAAW;IACX,MAAM,CAAC,EAAE,WAAW,GAAG,YAAY,GAAG,YAAY,CAAC;IACnD,yBAAyB;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/dist/utils.d.ts
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { ProgramInfo, RenderTarget } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* 创建 WebGL 着色器
|
|
4
|
+
*/
|
|
5
|
+
export declare function createShader(gl: WebGLRenderingContext, type: GLenum, source: string): WebGLShader | null;
|
|
6
|
+
/**
|
|
7
|
+
* 创建 WebGL 程序
|
|
8
|
+
*/
|
|
9
|
+
export declare function createProgram(gl: WebGLRenderingContext, vs: WebGLShader, fs: WebGLShader): WebGLProgram | null;
|
|
10
|
+
/**
|
|
11
|
+
* 构建程序信息
|
|
12
|
+
*/
|
|
13
|
+
export declare function buildProgram(gl: WebGLRenderingContext, vertex: string, fragment: string, uniforms: string[]): ProgramInfo;
|
|
14
|
+
/**
|
|
15
|
+
* 创建渲染目标
|
|
16
|
+
*/
|
|
17
|
+
export declare function createRenderTarget(gl: WebGLRenderingContext, width: number, height: number): RenderTarget;
|
|
18
|
+
/**
|
|
19
|
+
* 限制值在 0-1 范围内
|
|
20
|
+
*/
|
|
21
|
+
export declare const clamp01: (value: number) => number;
|
|
22
|
+
/**
|
|
23
|
+
* 三次贝塞尔曲线
|
|
24
|
+
*/
|
|
25
|
+
export declare const cubicBezier: (t: number, p0: number, p1: number, p2: number, p3: number) => number;
|
|
26
|
+
/**
|
|
27
|
+
* 构建曲线调色板
|
|
28
|
+
*/
|
|
29
|
+
export declare const buildCurvePalette: (lowControl: number, highControl: number) => Uint8Array;
|
|
30
|
+
/**
|
|
31
|
+
* 构建黑色调色板
|
|
32
|
+
*/
|
|
33
|
+
export declare const buildBlackPalette: (amount: number) => Uint8Array;
|
|
34
|
+
/**
|
|
35
|
+
* 创建调色板纹理
|
|
36
|
+
*/
|
|
37
|
+
export declare const createPaletteTexture: (gl: WebGLRenderingContext, data: Uint8Array) => WebGLTexture;
|
|
38
|
+
/**
|
|
39
|
+
* 更新调色板纹理
|
|
40
|
+
*/
|
|
41
|
+
export declare const updatePaletteTexture: (gl: WebGLRenderingContext, texture: WebGLTexture, data: Uint8Array) => void;
|
|
42
|
+
/**
|
|
43
|
+
* 构建对比度矩阵
|
|
44
|
+
*/
|
|
45
|
+
export declare const buildContrastMatrix: (amount: number) => Float32Array;
|
|
46
|
+
/**
|
|
47
|
+
* 构建饱和度矩阵
|
|
48
|
+
*/
|
|
49
|
+
export declare const buildSaturationMatrix: (amount: number) => Float32Array;
|
|
50
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEzD;;GAEG;AACH,wBAAgB,YAAY,CAC1B,EAAE,EAAE,qBAAqB,EACzB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,GACb,WAAW,GAAG,IAAI,CAapB;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,EAAE,EAAE,qBAAqB,EACzB,EAAE,EAAE,WAAW,EACf,EAAE,EAAE,WAAW,GACd,YAAY,GAAG,IAAI,CAcrB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,EAAE,EAAE,qBAAqB,EACzB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAAE,GACjB,WAAW,CAqBb;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,EAAE,EAAE,qBAAqB,EACzB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,YAAY,CAoCd;AAID;;GAEG;AACH,eAAO,MAAM,OAAO,GAAI,OAAO,MAAM,KAAG,MAAyC,CAAC;AAElF;;GAEG;AACH,eAAO,MAAM,WAAW,GAAI,GAAG,MAAM,EAAE,IAAI,MAAM,EAAE,IAAI,MAAM,EAAE,IAAI,MAAM,EAAE,IAAI,MAAM,KAAG,MAQvF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,iBAAiB,GAAI,YAAY,MAAM,EAAE,aAAa,MAAM,KAAG,UAY3E,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,iBAAiB,GAAI,QAAQ,MAAM,KAAG,UAMlD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,oBAAoB,GAAI,IAAI,qBAAqB,EAAE,MAAM,UAAU,KAAG,YAsBlF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,oBAAoB,GAC/B,IAAI,qBAAqB,EACzB,SAAS,YAAY,EACrB,MAAM,UAAU,KACf,IAaF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,mBAAmB,GAAI,QAAQ,MAAM,KAAG,YAUpD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,qBAAqB,GAAI,QAAQ,MAAM,KAAG,YAatD,CAAC"}
|
package/dist/utils.js
ADDED
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 创建 WebGL 着色器
|
|
3
|
+
*/
|
|
4
|
+
export function createShader(gl, type, source) {
|
|
5
|
+
const shader = gl.createShader(type);
|
|
6
|
+
if (!shader)
|
|
7
|
+
return null;
|
|
8
|
+
gl.shaderSource(shader, source);
|
|
9
|
+
gl.compileShader(shader);
|
|
10
|
+
if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
|
|
11
|
+
console.error('Shader compile error:', gl.getShaderInfoLog(shader));
|
|
12
|
+
gl.deleteShader(shader);
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
return shader;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* 创建 WebGL 程序
|
|
19
|
+
*/
|
|
20
|
+
export function createProgram(gl, vs, fs) {
|
|
21
|
+
const program = gl.createProgram();
|
|
22
|
+
if (!program)
|
|
23
|
+
return null;
|
|
24
|
+
gl.attachShader(program, vs);
|
|
25
|
+
gl.attachShader(program, fs);
|
|
26
|
+
gl.linkProgram(program);
|
|
27
|
+
if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
|
|
28
|
+
console.error('Program link error:', gl.getProgramInfoLog(program));
|
|
29
|
+
gl.deleteProgram(program);
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
return program;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* 构建程序信息
|
|
36
|
+
*/
|
|
37
|
+
export function buildProgram(gl, vertex, fragment, uniforms) {
|
|
38
|
+
const vs = createShader(gl, gl.VERTEX_SHADER, vertex);
|
|
39
|
+
const fs = createShader(gl, gl.FRAGMENT_SHADER, fragment);
|
|
40
|
+
if (!vs || !fs) {
|
|
41
|
+
throw new Error('Shader compile failed.');
|
|
42
|
+
}
|
|
43
|
+
const program = createProgram(gl, vs, fs);
|
|
44
|
+
if (!program) {
|
|
45
|
+
throw new Error('Program link failed.');
|
|
46
|
+
}
|
|
47
|
+
const attribs = {
|
|
48
|
+
aPosition: gl.getAttribLocation(program, 'aPosition'),
|
|
49
|
+
aTexCoord: gl.getAttribLocation(program, 'aTexCoord'),
|
|
50
|
+
apos: gl.getAttribLocation(program, 'apos'),
|
|
51
|
+
auv: gl.getAttribLocation(program, 'auv'),
|
|
52
|
+
};
|
|
53
|
+
const uniformMap = {};
|
|
54
|
+
uniforms.forEach((name) => {
|
|
55
|
+
uniformMap[name] = gl.getUniformLocation(program, name);
|
|
56
|
+
});
|
|
57
|
+
return { program, attribs, uniforms: uniformMap };
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* 创建渲染目标
|
|
61
|
+
*/
|
|
62
|
+
export function createRenderTarget(gl, width, height) {
|
|
63
|
+
const texture = gl.createTexture();
|
|
64
|
+
if (!texture) {
|
|
65
|
+
throw new Error('Unable to create texture');
|
|
66
|
+
}
|
|
67
|
+
gl.bindTexture(gl.TEXTURE_2D, texture);
|
|
68
|
+
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
|
|
69
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
|
|
70
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
|
|
71
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
|
|
72
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
|
|
73
|
+
const framebuffer = gl.createFramebuffer();
|
|
74
|
+
if (!framebuffer) {
|
|
75
|
+
throw new Error('Unable to create framebuffer');
|
|
76
|
+
}
|
|
77
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);
|
|
78
|
+
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0);
|
|
79
|
+
return { framebuffer, texture };
|
|
80
|
+
}
|
|
81
|
+
const PALETTE_SIZE = 256;
|
|
82
|
+
/**
|
|
83
|
+
* 限制值在 0-1 范围内
|
|
84
|
+
*/
|
|
85
|
+
export const clamp01 = (value) => Math.min(1, Math.max(0, value));
|
|
86
|
+
/**
|
|
87
|
+
* 三次贝塞尔曲线
|
|
88
|
+
*/
|
|
89
|
+
export const cubicBezier = (t, p0, p1, p2, p3) => {
|
|
90
|
+
const u = 1 - t;
|
|
91
|
+
return (u * u * u * p0 +
|
|
92
|
+
3 * u * u * t * p1 +
|
|
93
|
+
3 * u * t * t * p2 +
|
|
94
|
+
t * t * t * p3);
|
|
95
|
+
};
|
|
96
|
+
/**
|
|
97
|
+
* 构建曲线调色板
|
|
98
|
+
*/
|
|
99
|
+
export const buildCurvePalette = (lowControl, highControl) => {
|
|
100
|
+
const data = new Uint8Array(PALETTE_SIZE * 3);
|
|
101
|
+
for (let i = 0; i < PALETTE_SIZE; i += 1) {
|
|
102
|
+
const t = i / (PALETTE_SIZE - 1);
|
|
103
|
+
const y = cubicBezier(t, 0, lowControl, highControl, 1);
|
|
104
|
+
const v = Math.round(clamp01(y) * 255);
|
|
105
|
+
const idx = i * 3;
|
|
106
|
+
data[idx] = v;
|
|
107
|
+
data[idx + 1] = v;
|
|
108
|
+
data[idx + 2] = v;
|
|
109
|
+
}
|
|
110
|
+
return data;
|
|
111
|
+
};
|
|
112
|
+
/**
|
|
113
|
+
* 构建黑色调色板
|
|
114
|
+
*/
|
|
115
|
+
export const buildBlackPalette = (amount) => {
|
|
116
|
+
const amt = Math.max(-100, Math.min(100, amount)) / 100;
|
|
117
|
+
const strength = 0.35;
|
|
118
|
+
const lowControl = clamp01(0.33 - amt * strength);
|
|
119
|
+
const highControl = 0.66;
|
|
120
|
+
return buildCurvePalette(lowControl, highControl);
|
|
121
|
+
};
|
|
122
|
+
/**
|
|
123
|
+
* 创建调色板纹理
|
|
124
|
+
*/
|
|
125
|
+
export const createPaletteTexture = (gl, data) => {
|
|
126
|
+
const texture = gl.createTexture();
|
|
127
|
+
if (!texture) {
|
|
128
|
+
throw new Error('Unable to create palette texture');
|
|
129
|
+
}
|
|
130
|
+
gl.bindTexture(gl.TEXTURE_2D, texture);
|
|
131
|
+
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGB, PALETTE_SIZE, 1, 0, gl.RGB, gl.UNSIGNED_BYTE, data);
|
|
132
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
|
|
133
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
|
|
134
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
|
|
135
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
|
|
136
|
+
return texture;
|
|
137
|
+
};
|
|
138
|
+
/**
|
|
139
|
+
* 更新调色板纹理
|
|
140
|
+
*/
|
|
141
|
+
export const updatePaletteTexture = (gl, texture, data) => {
|
|
142
|
+
gl.bindTexture(gl.TEXTURE_2D, texture);
|
|
143
|
+
gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, PALETTE_SIZE, 1, gl.RGB, gl.UNSIGNED_BYTE, data);
|
|
144
|
+
};
|
|
145
|
+
/**
|
|
146
|
+
* 构建对比度矩阵
|
|
147
|
+
*/
|
|
148
|
+
export const buildContrastMatrix = (amount) => {
|
|
149
|
+
const t = Math.max(-100, Math.min(100, amount)) / 100;
|
|
150
|
+
const scale = 1 + t;
|
|
151
|
+
const offset = 0.5 * (1 - scale);
|
|
152
|
+
return new Float32Array([
|
|
153
|
+
scale, 0, 0, 0, offset,
|
|
154
|
+
0, scale, 0, 0, offset,
|
|
155
|
+
0, 0, scale, 0, offset,
|
|
156
|
+
0, 0, 0, 1, 0,
|
|
157
|
+
]);
|
|
158
|
+
};
|
|
159
|
+
/**
|
|
160
|
+
* 构建饱和度矩阵
|
|
161
|
+
*/
|
|
162
|
+
export const buildSaturationMatrix = (amount) => {
|
|
163
|
+
const t = Math.max(-100, Math.min(100, amount)) / 100;
|
|
164
|
+
const scale = 1 + t;
|
|
165
|
+
const lumR = 0.299;
|
|
166
|
+
const lumG = 0.587;
|
|
167
|
+
const lumB = 0.114;
|
|
168
|
+
const inv = 1 - scale;
|
|
169
|
+
return new Float32Array([
|
|
170
|
+
inv * lumR + scale, inv * lumG, inv * lumB, 0, 0,
|
|
171
|
+
inv * lumR, inv * lumG + scale, inv * lumB, 0, 0,
|
|
172
|
+
inv * lumR, inv * lumG, inv * lumB + scale, 0, 0,
|
|
173
|
+
0, 0, 0, 1, 0,
|
|
174
|
+
]);
|
|
175
|
+
};
|
|
176
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "image-color-grading",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "基于 WebGL 的高性能图像调色库,支持亮度、对比度、饱和度、色温等 22+ 种调色参数",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"module": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"import": "./dist/index.js",
|
|
12
|
+
"types": "./dist/index.d.ts"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist",
|
|
17
|
+
"README.md"
|
|
18
|
+
],
|
|
19
|
+
"scripts": {
|
|
20
|
+
"build": "tsc",
|
|
21
|
+
"dev": "tsc --watch",
|
|
22
|
+
"prepublishOnly": "npm run build"
|
|
23
|
+
},
|
|
24
|
+
"keywords": [
|
|
25
|
+
"image",
|
|
26
|
+
"color",
|
|
27
|
+
"grading",
|
|
28
|
+
"filter",
|
|
29
|
+
"webgl",
|
|
30
|
+
"brightness",
|
|
31
|
+
"contrast",
|
|
32
|
+
"saturation",
|
|
33
|
+
"photo",
|
|
34
|
+
"edit",
|
|
35
|
+
"调色",
|
|
36
|
+
"图像处理"
|
|
37
|
+
],
|
|
38
|
+
"author": "",
|
|
39
|
+
"license": "MIT",
|
|
40
|
+
"repository": {
|
|
41
|
+
"type": "git",
|
|
42
|
+
"url": ""
|
|
43
|
+
},
|
|
44
|
+
"devDependencies": {
|
|
45
|
+
"typescript": "^5.0.0"
|
|
46
|
+
},
|
|
47
|
+
"engines": {
|
|
48
|
+
"node": ">=16.0.0"
|
|
49
|
+
},
|
|
50
|
+
"sideEffects": false
|
|
51
|
+
}
|