@jieyin/editor-sdk 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of @jieyin/editor-sdk might be problematic. Click here for more details.
- package/README.md +75 -0
- package/dist/components/Editor/components/CanvasSection.vue.d.ts +90 -0
- package/dist/components/Editor/components/EditorSidebar.vue.d.ts +316 -0
- package/dist/components/Editor/components/EditorTopbar.vue.d.ts +37 -0
- package/dist/components/Editor/components/PreviewPanel.vue.d.ts +67 -0
- package/dist/components/Editor/components/TemplateModal.vue.d.ts +35 -0
- package/dist/components/Editor/index.vue.d.ts +21 -0
- package/dist/components/Editor/workers/copyDiecuts.worker.d.ts +14 -0
- package/dist/components/Editor/workers/maskWorker.d.ts +13 -0
- package/dist/components/Editor/workers/renderWorker.d.ts +1 -0
- package/dist/index.d.ts +38 -0
- package/dist/types.d.ts +70 -0
- package/dist/utils/encryptJson.d.ts +31 -0
- package/dist/utils/fileToken.d.ts +16 -0
- package/dist/utils/renderService/blend.d.ts +4 -0
- package/dist/utils/renderService/deform.d.ts +21 -0
- package/dist/utils/renderService/deform.worker.d.ts +189 -0
- package/dist/utils/renderService/image.d.ts +8 -0
- package/dist/utils/renderService/index.d.ts +12 -0
- package/dist/utils/renderService/mask.d.ts +13 -0
- package/dist/utils/renderService/prepareRenderData.d.ts +2 -0
- package/dist/utils/renderService/psdConverter.d.ts +6 -0
- package/dist/utils/renderService/render.d.ts +14 -0
- package/dist/utils/renderService/render.worker.d.ts +17 -0
- package/dist/utils/renderService/types.d.ts +216 -0
- package/dist/utils/renderService/workerManager.d.ts +24 -0
- package/package.json +31 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { App } from 'vue';
|
|
2
|
+
import Editor from './components/Editor/index.vue';
|
|
3
|
+
export * from './types';
|
|
4
|
+
export * from './utils/renderService';
|
|
5
|
+
export * from './utils/fileToken';
|
|
6
|
+
export { Editor };
|
|
7
|
+
export declare const install: (app: App) => void;
|
|
8
|
+
declare const _default: {
|
|
9
|
+
install: (app: App) => void;
|
|
10
|
+
Editor: import("vue").DefineComponent<{
|
|
11
|
+
product?: import("./types").ProductItem | null;
|
|
12
|
+
basicInfo?: import("./types").BasicInfo | null;
|
|
13
|
+
diecutData?: import("./types").DiecutResponse | null;
|
|
14
|
+
deformationData?: import("./types").DeformationResponse | null;
|
|
15
|
+
options?: import("./types").EditorOptions;
|
|
16
|
+
productListApi?: import("./types").ProductListApi;
|
|
17
|
+
productDetailApi?: import("./types").ProductDetailApi;
|
|
18
|
+
productListPageSize?: number;
|
|
19
|
+
productListInitialPage?: number;
|
|
20
|
+
}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{
|
|
21
|
+
product?: import("./types").ProductItem | null;
|
|
22
|
+
basicInfo?: import("./types").BasicInfo | null;
|
|
23
|
+
diecutData?: import("./types").DiecutResponse | null;
|
|
24
|
+
deformationData?: import("./types").DeformationResponse | null;
|
|
25
|
+
options?: import("./types").EditorOptions;
|
|
26
|
+
productListApi?: import("./types").ProductListApi;
|
|
27
|
+
productDetailApi?: import("./types").ProductDetailApi;
|
|
28
|
+
productListPageSize?: number;
|
|
29
|
+
productListInitialPage?: number;
|
|
30
|
+
}> & Readonly<{}>, {
|
|
31
|
+
product: import("./types").ProductItem | null;
|
|
32
|
+
basicInfo: import("./types").BasicInfo | null;
|
|
33
|
+
diecutData: import("./types").DiecutResponse | null;
|
|
34
|
+
deformationData: import("./types").DeformationResponse | null;
|
|
35
|
+
options: import("./types").EditorOptions;
|
|
36
|
+
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
37
|
+
};
|
|
38
|
+
export default _default;
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
export type ProductItem = {
|
|
2
|
+
id?: number | string;
|
|
3
|
+
name?: string;
|
|
4
|
+
description?: string;
|
|
5
|
+
coverImg?: string;
|
|
6
|
+
};
|
|
7
|
+
export type BasicInfo = {
|
|
8
|
+
id?: number | string;
|
|
9
|
+
name?: string;
|
|
10
|
+
description?: string;
|
|
11
|
+
sizes?: string[];
|
|
12
|
+
coverImg?: string;
|
|
13
|
+
};
|
|
14
|
+
export type DiecutResource = {
|
|
15
|
+
groupId?: string;
|
|
16
|
+
groupName?: string;
|
|
17
|
+
fileName?: string;
|
|
18
|
+
url?: string;
|
|
19
|
+
type?: string;
|
|
20
|
+
width?: number;
|
|
21
|
+
height?: number;
|
|
22
|
+
};
|
|
23
|
+
export type DiecutItem = {
|
|
24
|
+
jsonURL?: string | null;
|
|
25
|
+
size?: string;
|
|
26
|
+
type?: string;
|
|
27
|
+
resources?: DiecutResource[] | null;
|
|
28
|
+
sizeMode?: string;
|
|
29
|
+
};
|
|
30
|
+
export type DiecutResponse = {
|
|
31
|
+
msg?: string;
|
|
32
|
+
code?: number;
|
|
33
|
+
data?: DiecutItem[];
|
|
34
|
+
};
|
|
35
|
+
export type DeformationInfo = {
|
|
36
|
+
name?: string;
|
|
37
|
+
jsonURL?: string;
|
|
38
|
+
sort?: number;
|
|
39
|
+
resources?: Array<{
|
|
40
|
+
name?: string;
|
|
41
|
+
url?: string;
|
|
42
|
+
}>;
|
|
43
|
+
};
|
|
44
|
+
export type DeformationGroup = {
|
|
45
|
+
size?: string;
|
|
46
|
+
sizeMode?: string;
|
|
47
|
+
infos?: DeformationInfo[] | null;
|
|
48
|
+
};
|
|
49
|
+
export type DeformationResponse = {
|
|
50
|
+
msg?: string;
|
|
51
|
+
code?: number;
|
|
52
|
+
data?: DeformationGroup[];
|
|
53
|
+
};
|
|
54
|
+
export type EditorOptions = {
|
|
55
|
+
showTopbar?: boolean;
|
|
56
|
+
showSidebar?: boolean;
|
|
57
|
+
showPreview?: boolean;
|
|
58
|
+
enableGrid?: boolean;
|
|
59
|
+
};
|
|
60
|
+
export type ProductListResult = {
|
|
61
|
+
rows: ProductItem[];
|
|
62
|
+
total?: number;
|
|
63
|
+
};
|
|
64
|
+
export type ProductListApi = (page: number, pageSize: number) => Promise<ProductListResult>;
|
|
65
|
+
export type ProductDetailResult = {
|
|
66
|
+
basicInfo?: BasicInfo | null;
|
|
67
|
+
diecutData?: DiecutResponse | null;
|
|
68
|
+
deformationData?: DeformationResponse | null;
|
|
69
|
+
};
|
|
70
|
+
export type ProductDetailApi = (productId: number | string) => Promise<ProductDetailResult>;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 生成固定密钥
|
|
3
|
+
* 使用固定的基础字符串,确保每次生成的密钥都相同
|
|
4
|
+
* 这样加密和解密可以使用相同的密钥
|
|
5
|
+
*/
|
|
6
|
+
export declare function generateFixedKey(): string;
|
|
7
|
+
/**
|
|
8
|
+
* 获取加密密钥
|
|
9
|
+
* 优先使用环境变量,如果没有则使用固定密钥
|
|
10
|
+
*/
|
|
11
|
+
export declare function getEncryptionKey(): string;
|
|
12
|
+
/**
|
|
13
|
+
* 清理 JSON 数据,确保所有 blob URL 都被替换为 base64
|
|
14
|
+
* @param jsonData - 要处理的 JSON 数据
|
|
15
|
+
* @returns 处理后的 JSON 数据
|
|
16
|
+
*/
|
|
17
|
+
export declare function cleanBlobUrls(jsonData: unknown): unknown;
|
|
18
|
+
/**
|
|
19
|
+
* 加密 JSON 数据
|
|
20
|
+
* @param jsonData - 要加密的 JSON 对象
|
|
21
|
+
* @param key - 加密密钥(可选,默认使用固定密钥)
|
|
22
|
+
* @returns 加密后的字符串(Base64 格式)
|
|
23
|
+
*/
|
|
24
|
+
export declare function encryptJsonData(jsonData: unknown, key?: string): string;
|
|
25
|
+
/**
|
|
26
|
+
* 解密 JSON 数据
|
|
27
|
+
* @param encryptedData - 加密后的字符串
|
|
28
|
+
* @param key - 解密密钥(可选,默认使用固定密钥)
|
|
29
|
+
* @returns 解密后的 JSON 对象
|
|
30
|
+
*/
|
|
31
|
+
export declare function decryptJsonData<T = unknown>(encryptedData: string, key?: string): T;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export declare function getFileToken(): string | null;
|
|
2
|
+
export declare function isFileTokenExpired(bufferMs?: number): boolean;
|
|
3
|
+
export declare function clearFileToken(): void;
|
|
4
|
+
type FileTokenFetchers = {
|
|
5
|
+
fetchFileToken: () => Promise<any>;
|
|
6
|
+
fetchFileTokenRefresh?: () => Promise<any>;
|
|
7
|
+
};
|
|
8
|
+
export declare function setFileTokenFetchers(fetchers: FileTokenFetchers | null): void;
|
|
9
|
+
export declare function getFileTokenFetchers(): FileTokenFetchers | null;
|
|
10
|
+
export declare function ensureFileToken(): Promise<string | null>;
|
|
11
|
+
export declare function appendFileTokenToUrl(url: string, token?: string | null): string;
|
|
12
|
+
export declare function appendFileTokenIfPresent(url: string): string;
|
|
13
|
+
export declare function stripFileTokenParam(url: string): string;
|
|
14
|
+
export declare function withFileToken(url: string): Promise<string>;
|
|
15
|
+
export declare function fetchWithFileToken(url: string, options?: RequestInit): Promise<Response>;
|
|
16
|
+
export {};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { ISmartObject } from "./types";
|
|
2
|
+
/**
|
|
3
|
+
* 变形渲染封装函数
|
|
4
|
+
* @param image - 输入图片,支持 URL、HTMLImageElement 或 ImageBitmap
|
|
5
|
+
* @param smartObject - 部位数据(智能对象配置)
|
|
6
|
+
* @param faceId - 面 ID,用于标识 worker(可选,默认为 0)
|
|
7
|
+
* @returns 变形后的图片 HTMLImageElement
|
|
8
|
+
*/
|
|
9
|
+
export declare function deformImage(image: string | HTMLImageElement | ImageBitmap, smartObject: ISmartObject, faceId?: number, maxImageSize?: number): Promise<HTMLImageElement>;
|
|
10
|
+
/**
|
|
11
|
+
* 变形渲染封装函数(返回 ImageBitmap)
|
|
12
|
+
* @param image - 输入图片,支持 URL、HTMLImageElement 或 ImageBitmap
|
|
13
|
+
* @param smartObject - 部位数据(智能对象配置)
|
|
14
|
+
* @param faceId - 面 ID,用于标识 worker(可选,默认为 0)
|
|
15
|
+
* @param canvasSize - 画布尺寸(可选,默认使用 smartObject.size)
|
|
16
|
+
* @returns 变形后的 ImageBitmap
|
|
17
|
+
*/
|
|
18
|
+
export declare function deformImageBitmap(image: string | HTMLImageElement | ImageBitmap, smartObject: ISmartObject, faceId?: number, canvasSize?: {
|
|
19
|
+
width: number;
|
|
20
|
+
height: number;
|
|
21
|
+
}, maxImageSize?: number): Promise<ImageBitmap>;
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* deform.worker.ts - 变形 Web Worker
|
|
3
|
+
*
|
|
4
|
+
* 包含所有变形算法(透视变换、网格变形、Puppet Warp等)
|
|
5
|
+
* 独立运行,无需外部依赖
|
|
6
|
+
*/
|
|
7
|
+
interface IPoint {
|
|
8
|
+
x: number;
|
|
9
|
+
y: number;
|
|
10
|
+
type?: number;
|
|
11
|
+
}
|
|
12
|
+
interface IBounds {
|
|
13
|
+
top: number;
|
|
14
|
+
left: number;
|
|
15
|
+
bottom?: number;
|
|
16
|
+
right?: number;
|
|
17
|
+
width: number;
|
|
18
|
+
height: number;
|
|
19
|
+
}
|
|
20
|
+
interface IPuppetShape {
|
|
21
|
+
originalVertexArray: IPoint[];
|
|
22
|
+
deformedVertexArray: IPoint[];
|
|
23
|
+
indexArray: number[];
|
|
24
|
+
}
|
|
25
|
+
interface IFilter {
|
|
26
|
+
type: string;
|
|
27
|
+
enabled: boolean;
|
|
28
|
+
filter?: {
|
|
29
|
+
puppetShapeList?: IPuppetShape[];
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
interface IVectorKnot {
|
|
33
|
+
linked: boolean;
|
|
34
|
+
points: number[];
|
|
35
|
+
}
|
|
36
|
+
interface IVectorPath {
|
|
37
|
+
open: boolean;
|
|
38
|
+
knots: IVectorKnot[];
|
|
39
|
+
fillRule?: string;
|
|
40
|
+
operation?: string;
|
|
41
|
+
}
|
|
42
|
+
interface IVectorMask {
|
|
43
|
+
paths: IVectorPath[];
|
|
44
|
+
points?: IPoint[];
|
|
45
|
+
invert?: boolean;
|
|
46
|
+
notLink?: boolean;
|
|
47
|
+
disable?: boolean;
|
|
48
|
+
fillStartsWithAllPixels?: boolean;
|
|
49
|
+
}
|
|
50
|
+
interface ISmartObject {
|
|
51
|
+
name?: string;
|
|
52
|
+
type?: string;
|
|
53
|
+
blendMode?: string;
|
|
54
|
+
transform: number[];
|
|
55
|
+
meshPoints?: IPoint[];
|
|
56
|
+
bounds: IBounds;
|
|
57
|
+
isSmartObject?: boolean;
|
|
58
|
+
size?: {
|
|
59
|
+
width: number;
|
|
60
|
+
height: number;
|
|
61
|
+
};
|
|
62
|
+
originalWidth?: number;
|
|
63
|
+
originalHeight?: number;
|
|
64
|
+
quiltSliceX?: number[];
|
|
65
|
+
quiltSliceY?: number[];
|
|
66
|
+
layerOrder?: number;
|
|
67
|
+
imagePath?: string;
|
|
68
|
+
vectorMask?: IVectorMask;
|
|
69
|
+
placedLayer?: {
|
|
70
|
+
width: number;
|
|
71
|
+
height: number;
|
|
72
|
+
};
|
|
73
|
+
filterList?: IFilter[];
|
|
74
|
+
}
|
|
75
|
+
interface ITransformPoint {
|
|
76
|
+
x: number;
|
|
77
|
+
y: number;
|
|
78
|
+
}
|
|
79
|
+
interface IPerspectiveMatrix {
|
|
80
|
+
a: number;
|
|
81
|
+
b: number;
|
|
82
|
+
c: number;
|
|
83
|
+
d: number;
|
|
84
|
+
e: number;
|
|
85
|
+
f: number;
|
|
86
|
+
g: number;
|
|
87
|
+
h: number;
|
|
88
|
+
i?: number;
|
|
89
|
+
}
|
|
90
|
+
type RenderType = "bilinear" | "bicubic" | "grid";
|
|
91
|
+
type DeformPayload = {
|
|
92
|
+
id: number;
|
|
93
|
+
designBitmap: ImageBitmap;
|
|
94
|
+
layerData: ISmartObject;
|
|
95
|
+
canvasSize?: {
|
|
96
|
+
width: number;
|
|
97
|
+
height: number;
|
|
98
|
+
};
|
|
99
|
+
};
|
|
100
|
+
type DeformResult = {
|
|
101
|
+
id: number;
|
|
102
|
+
imageBitmap?: ImageBitmap;
|
|
103
|
+
error?: string;
|
|
104
|
+
duration?: number;
|
|
105
|
+
};
|
|
106
|
+
/** 获取图像源的宽高 */
|
|
107
|
+
declare function getImageSize(img: CanvasImageSource): {
|
|
108
|
+
width: number;
|
|
109
|
+
height: number;
|
|
110
|
+
};
|
|
111
|
+
/**
|
|
112
|
+
* 数据预处理函数(关键逻辑)
|
|
113
|
+
*/
|
|
114
|
+
declare function dataPreprocessor(layerData: ISmartObject, canvasSize?: {
|
|
115
|
+
width: number;
|
|
116
|
+
height: number;
|
|
117
|
+
}): ISmartObject;
|
|
118
|
+
/**
|
|
119
|
+
* 结果后处理函数(关键逻辑)
|
|
120
|
+
*/
|
|
121
|
+
declare function resultPostprocessor(result: {
|
|
122
|
+
id: number;
|
|
123
|
+
imageBitmap?: ImageBitmap;
|
|
124
|
+
error?: string;
|
|
125
|
+
duration?: number;
|
|
126
|
+
}): {
|
|
127
|
+
id: number;
|
|
128
|
+
imageBitmap?: ImageBitmap;
|
|
129
|
+
error?: string;
|
|
130
|
+
duration?: number;
|
|
131
|
+
};
|
|
132
|
+
/**
|
|
133
|
+
* 应用图像变形功能(核心算法,需要加密)
|
|
134
|
+
* @param ctx - Canvas 2D 上下文
|
|
135
|
+
* @param img - 要变形的图片对象
|
|
136
|
+
* @param layerData - 图层数据对象,包含变形参数
|
|
137
|
+
* @returns 返回使用的变形方法名称
|
|
138
|
+
* @encrypt
|
|
139
|
+
*/
|
|
140
|
+
declare function applyImageTransform(ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D, img: CanvasImageSource, layerData: ISmartObject): string;
|
|
141
|
+
/**
|
|
142
|
+
* Puppet Warp 变形算法(核心算法,需要加密)
|
|
143
|
+
* @encrypt
|
|
144
|
+
*/
|
|
145
|
+
declare function renderPuppetWarp(ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D, img: CanvasImageSource, transPts: ITransformPoint[], shapeData: IPuppetShape, _refW: number, _refH: number): void;
|
|
146
|
+
/**
|
|
147
|
+
* G24 投影网格变形算法(核心算法,需要加密)
|
|
148
|
+
* @encrypt
|
|
149
|
+
*/
|
|
150
|
+
declare function renderG24ProjectedMesh(ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D, img: CanvasImageSource, transPts: ITransformPoint[], meshPts: IPoint[]): void;
|
|
151
|
+
/**
|
|
152
|
+
* Quilt 投影变形算法(核心算法,需要加密)
|
|
153
|
+
* @encrypt
|
|
154
|
+
*/
|
|
155
|
+
declare function renderQuiltProjected(ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D, img: CanvasImageSource, transPts: ITransformPoint[], meshPts: IPoint[], sliceX: number[], sliceY: number[], refW: number, refH: number): void;
|
|
156
|
+
/**
|
|
157
|
+
* 自动适配投影网格变形算法(核心算法,需要加密)
|
|
158
|
+
* @encrypt
|
|
159
|
+
*/
|
|
160
|
+
declare function renderProjectedMeshAutoFit(ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D, img: CanvasImageSource, transPts: ITransformPoint[], meshPts: IPoint[]): void;
|
|
161
|
+
/**
|
|
162
|
+
* 双三次补丁子集变形算法(核心算法,需要加密)
|
|
163
|
+
* @encrypt
|
|
164
|
+
*/
|
|
165
|
+
declare function renderBicubicPatchSubset(ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D, img: CanvasImageSource, pts: ITransformPoint[], uStart: number, uEnd: number, vStart: number, vEnd: number): void;
|
|
166
|
+
/**
|
|
167
|
+
* 直接透视变形算法(核心算法,需要加密)
|
|
168
|
+
* @encrypt
|
|
169
|
+
*/
|
|
170
|
+
declare function renderPerspectiveDirect(ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D, img: CanvasImageSource, pts: ITransformPoint[]): void;
|
|
171
|
+
declare function renderBicubicDirect(ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D, img: CanvasImageSource, pts: IPoint[]): void;
|
|
172
|
+
declare function renderInternal(ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D, img: CanvasImageSource, pts: ITransformPoint[] | IPoint[], type: RenderType, gridDim: number, sub: number): void;
|
|
173
|
+
declare function B(i: number, t: number): number;
|
|
174
|
+
declare function getBicubicPoint(u: number, v: number, p: ITransformPoint[]): ITransformPoint;
|
|
175
|
+
declare function getBilinearPoint(u: number, v: number, p: ITransformPoint[]): ITransformPoint;
|
|
176
|
+
declare function getArbitraryMeshPoint(u: number, v: number, pts: IPoint[], dim: number): ITransformPoint;
|
|
177
|
+
/**
|
|
178
|
+
* 计算透视变换矩阵(核心算法,需要加密)
|
|
179
|
+
* @encrypt
|
|
180
|
+
*/
|
|
181
|
+
declare function calcPerspectiveMatrix(p: ITransformPoint[]): IPerspectiveMatrix;
|
|
182
|
+
/**
|
|
183
|
+
* 矩阵求逆算法(核心算法,需要加密)
|
|
184
|
+
* @encrypt
|
|
185
|
+
*/
|
|
186
|
+
declare function invertHomography(m: IPerspectiveMatrix): IPerspectiveMatrix | null;
|
|
187
|
+
declare function applyInversePerspective(x: number, y: number, m: IPerspectiveMatrix): ITransformPoint;
|
|
188
|
+
declare function applyPerspective(u: number, v: number, m: IPerspectiveMatrix): ITransformPoint;
|
|
189
|
+
declare function drawTri(ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D, img: CanvasImageSource, t0: ITransformPoint, t1: ITransformPoint, t2: ITransformPoint, p0: ITransformPoint | IPoint, p1: ITransformPoint | IPoint, p2: ITransformPoint | IPoint): void;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 将输入图片转换为 ImageBitmap
|
|
3
|
+
*/
|
|
4
|
+
export declare function toImageBitmap(image: string | HTMLImageElement | ImageBitmap, maxImageSize?: number): Promise<ImageBitmap>;
|
|
5
|
+
/**
|
|
6
|
+
* 加载图片为 ImageBitmap
|
|
7
|
+
*/
|
|
8
|
+
export declare function loadImageBitmap(url: string, maxImageSize?: number): Promise<ImageBitmap>;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* renderService - 渲染服务
|
|
3
|
+
* 按功能拆分到多个文件,本文件仅做统一导出
|
|
4
|
+
*/
|
|
5
|
+
export * from "./types";
|
|
6
|
+
export * from "./psdConverter";
|
|
7
|
+
export * from "./mask";
|
|
8
|
+
export * from "./image";
|
|
9
|
+
export * from "./blend";
|
|
10
|
+
export * from "./workerManager";
|
|
11
|
+
export * from "./deform";
|
|
12
|
+
export * from "./render";
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { IMaskData, ISmartObject } from "./types";
|
|
2
|
+
/**
|
|
3
|
+
* 智能获取蒙版数据
|
|
4
|
+
*/
|
|
5
|
+
export declare function getMaskFromData(data: ISmartObject): IMaskData | null;
|
|
6
|
+
/**
|
|
7
|
+
* 规范化蒙版数据(转换 Vue Proxy 对象为普通对象)
|
|
8
|
+
*/
|
|
9
|
+
export declare function normalizeMaskData(maskData?: IMaskData | null): IMaskData | null;
|
|
10
|
+
/**
|
|
11
|
+
* 应用矢量蒙版到 canvas
|
|
12
|
+
*/
|
|
13
|
+
export declare function applyVectorMask(ctx: CanvasRenderingContext2D, maskData: IMaskData | null): void;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { IDeformResult, IRenderByJsonResult, TLayerExtrasByName } from "./types";
|
|
2
|
+
import type { IPsdJsonData, IRenderByJson } from "./types";
|
|
3
|
+
/**
|
|
4
|
+
* 根据 JSON 和 layerExtrasByName 进行变形(核心算法)
|
|
5
|
+
*/
|
|
6
|
+
export declare function deformByJson(psdJson: IPsdJsonData, layerExtrasByName: TLayerExtrasByName): Promise<IDeformResult[]>;
|
|
7
|
+
/**
|
|
8
|
+
* 根据 JSON 和 layerExtrasByName 渲染所有图层到 canvas(核心算法)
|
|
9
|
+
*/
|
|
10
|
+
export declare function renderByJson(data: IRenderByJson): Promise<IRenderByJsonResult>;
|
|
11
|
+
/**
|
|
12
|
+
* 下载 canvas 为图片
|
|
13
|
+
*/
|
|
14
|
+
export declare function downloadCanvas(canvas: HTMLCanvasElement | OffscreenCanvas, filename?: string): Promise<void>;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export type IMaskData = {
|
|
2
|
+
type: "bezier";
|
|
3
|
+
paths: Array<{
|
|
4
|
+
open: boolean;
|
|
5
|
+
knots: Array<{
|
|
6
|
+
linked: boolean;
|
|
7
|
+
points: number[];
|
|
8
|
+
}>;
|
|
9
|
+
}>;
|
|
10
|
+
} | {
|
|
11
|
+
type: "simple";
|
|
12
|
+
points: Array<{
|
|
13
|
+
x: number;
|
|
14
|
+
y: number;
|
|
15
|
+
type?: number;
|
|
16
|
+
}>;
|
|
17
|
+
};
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
export declare enum EPartType {
|
|
2
|
+
Drawing = 0,// 可绘制插画
|
|
3
|
+
Material = 1
|
|
4
|
+
}
|
|
5
|
+
/** 2D顶点,相对于画布的坐标系 */
|
|
6
|
+
export interface IPoint {
|
|
7
|
+
x: number;
|
|
8
|
+
y: number;
|
|
9
|
+
type?: number;
|
|
10
|
+
}
|
|
11
|
+
/** 矢量蒙版节点,包含贝塞尔曲线控制点 */
|
|
12
|
+
export interface IVectorKnot {
|
|
13
|
+
linked: boolean;
|
|
14
|
+
points: number[];
|
|
15
|
+
}
|
|
16
|
+
/** 矢量路径 */
|
|
17
|
+
export interface IVectorPath {
|
|
18
|
+
open: boolean;
|
|
19
|
+
knots: IVectorKnot[];
|
|
20
|
+
fillRule?: string;
|
|
21
|
+
operation?: string;
|
|
22
|
+
}
|
|
23
|
+
/** 矢量蒙版 */
|
|
24
|
+
export interface IVectorMask {
|
|
25
|
+
paths: IVectorPath[];
|
|
26
|
+
points?: IPoint[];
|
|
27
|
+
invert?: boolean;
|
|
28
|
+
notLink?: boolean;
|
|
29
|
+
disable?: boolean;
|
|
30
|
+
fillStartsWithAllPixels?: boolean;
|
|
31
|
+
}
|
|
32
|
+
export interface IBounds {
|
|
33
|
+
top: number;
|
|
34
|
+
left: number;
|
|
35
|
+
bottom?: number;
|
|
36
|
+
right?: number;
|
|
37
|
+
width: number;
|
|
38
|
+
height: number;
|
|
39
|
+
}
|
|
40
|
+
export interface IPuppetShape {
|
|
41
|
+
originalVertexArray: IPoint[];
|
|
42
|
+
deformedVertexArray: IPoint[];
|
|
43
|
+
indexArray: number[];
|
|
44
|
+
}
|
|
45
|
+
export interface IFilter {
|
|
46
|
+
type: string;
|
|
47
|
+
enabled: boolean;
|
|
48
|
+
filter?: {
|
|
49
|
+
puppetShapeList?: IPuppetShape[];
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
export interface ISmartObject {
|
|
53
|
+
name?: string;
|
|
54
|
+
type?: string;
|
|
55
|
+
blendMode?: string;
|
|
56
|
+
transform: number[];
|
|
57
|
+
meshPoints?: IPoint[];
|
|
58
|
+
bounds: IBounds;
|
|
59
|
+
isSmartObject?: boolean;
|
|
60
|
+
size?: {
|
|
61
|
+
width: number;
|
|
62
|
+
height: number;
|
|
63
|
+
};
|
|
64
|
+
originalWidth?: number;
|
|
65
|
+
originalHeight?: number;
|
|
66
|
+
quiltSliceX?: number[];
|
|
67
|
+
quiltSliceY?: number[];
|
|
68
|
+
layerOrder?: number;
|
|
69
|
+
imagePath?: string;
|
|
70
|
+
vectorMask?: IVectorMask;
|
|
71
|
+
placedLayer?: {
|
|
72
|
+
width: number;
|
|
73
|
+
height: number;
|
|
74
|
+
};
|
|
75
|
+
filterList?: IFilter[];
|
|
76
|
+
opacity?: number;
|
|
77
|
+
clipping?: boolean;
|
|
78
|
+
}
|
|
79
|
+
/** 裁片部位数据 */
|
|
80
|
+
export interface IPart {
|
|
81
|
+
id: number;
|
|
82
|
+
name: string;
|
|
83
|
+
url?: string;
|
|
84
|
+
designArea?: string;
|
|
85
|
+
pureUrl?: string;
|
|
86
|
+
width?: number;
|
|
87
|
+
height?: number;
|
|
88
|
+
partType?: EPartType;
|
|
89
|
+
}
|
|
90
|
+
export declare enum EPsdDataType {
|
|
91
|
+
Group = 0,// 部件组
|
|
92
|
+
Layer = 1
|
|
93
|
+
}
|
|
94
|
+
/** psd部位数据 */
|
|
95
|
+
export interface IPsdPartData {
|
|
96
|
+
id: number;
|
|
97
|
+
partId?: number;
|
|
98
|
+
name: string;
|
|
99
|
+
blendMode?: string;
|
|
100
|
+
vectorMaskPath?: IPoint[];
|
|
101
|
+
smartObjects?: ISmartObject[];
|
|
102
|
+
type: EPsdDataType;
|
|
103
|
+
url?: string;
|
|
104
|
+
bounds?: IBounds;
|
|
105
|
+
opacity?: number;
|
|
106
|
+
clipping?: boolean;
|
|
107
|
+
layerOrder?: number;
|
|
108
|
+
}
|
|
109
|
+
/** 模特图数据 */
|
|
110
|
+
export interface IPsdModelData {
|
|
111
|
+
width: number;
|
|
112
|
+
height: number;
|
|
113
|
+
psdPartData?: IPsdPartData[];
|
|
114
|
+
}
|
|
115
|
+
/** 版型数据 */
|
|
116
|
+
export interface IModelData {
|
|
117
|
+
parts: IPart[];
|
|
118
|
+
models: IPsdModelData[];
|
|
119
|
+
}
|
|
120
|
+
export type PsdLayerType = "Layer" | "Group";
|
|
121
|
+
export interface IPsdJsonLayer {
|
|
122
|
+
name: string;
|
|
123
|
+
type: PsdLayerType;
|
|
124
|
+
blendMode?: string;
|
|
125
|
+
bounds?: IBounds;
|
|
126
|
+
layerOrder?: number;
|
|
127
|
+
imagePath?: string;
|
|
128
|
+
vectorMask?: IVectorMask;
|
|
129
|
+
children?: IPsdJsonLayer[];
|
|
130
|
+
isSmartObject?: boolean;
|
|
131
|
+
size?: {
|
|
132
|
+
width: number;
|
|
133
|
+
height: number;
|
|
134
|
+
};
|
|
135
|
+
placedLayer?: {
|
|
136
|
+
width: number;
|
|
137
|
+
height: number;
|
|
138
|
+
};
|
|
139
|
+
originalWidth?: number;
|
|
140
|
+
originalHeight?: number;
|
|
141
|
+
meshPoints?: IPoint[];
|
|
142
|
+
transform?: number[];
|
|
143
|
+
quiltSliceX?: number[];
|
|
144
|
+
quiltSliceY?: number[];
|
|
145
|
+
filterList?: IFilter[];
|
|
146
|
+
id?: number;
|
|
147
|
+
opacity?: number;
|
|
148
|
+
clipping?: boolean;
|
|
149
|
+
}
|
|
150
|
+
export interface IPsdJsonData {
|
|
151
|
+
canvasWidth: number;
|
|
152
|
+
canvasHeight: number;
|
|
153
|
+
layerList: IPsdJsonLayer[];
|
|
154
|
+
}
|
|
155
|
+
export interface ILayerExtras {
|
|
156
|
+
id?: number;
|
|
157
|
+
partId?: number;
|
|
158
|
+
url?: string;
|
|
159
|
+
/** 变形部位对应的设计图片(URL、HTMLImageElement 或 ImageBitmap) */
|
|
160
|
+
designImage?: string | HTMLImageElement | ImageBitmap;
|
|
161
|
+
}
|
|
162
|
+
export interface IConvertPsdOptions {
|
|
163
|
+
parts: IPart[];
|
|
164
|
+
defaultIdStart?: number;
|
|
165
|
+
}
|
|
166
|
+
export interface IConvertPsdInput {
|
|
167
|
+
psdJson: IPsdJsonData;
|
|
168
|
+
layerExtrasByName?: Record<string, ILayerExtras>;
|
|
169
|
+
}
|
|
170
|
+
/** 蒙版数据类型 */
|
|
171
|
+
export type IMaskData = {
|
|
172
|
+
type: "bezier";
|
|
173
|
+
paths: IVectorPath[];
|
|
174
|
+
} | {
|
|
175
|
+
type: "simple";
|
|
176
|
+
points: IPoint[];
|
|
177
|
+
};
|
|
178
|
+
/** 图层额外信息类型(包含变形图片) */
|
|
179
|
+
export interface ILayerExtrasWithImage {
|
|
180
|
+
id?: number;
|
|
181
|
+
partId?: number;
|
|
182
|
+
url?: string;
|
|
183
|
+
designImage?: string | HTMLImageElement | ImageBitmap;
|
|
184
|
+
}
|
|
185
|
+
/** layerExtrasByName 类型 */
|
|
186
|
+
export type TLayerExtrasByName = Record<string, ILayerExtrasWithImage>;
|
|
187
|
+
/** 变形结果 */
|
|
188
|
+
export interface IDeformResult {
|
|
189
|
+
layerName: string;
|
|
190
|
+
partId?: number;
|
|
191
|
+
imageBitmap: ImageBitmap;
|
|
192
|
+
}
|
|
193
|
+
/** 渲染结果 */
|
|
194
|
+
export interface IRenderByJsonResult {
|
|
195
|
+
canvas: HTMLCanvasElement | OffscreenCanvas;
|
|
196
|
+
width: number;
|
|
197
|
+
height: number;
|
|
198
|
+
}
|
|
199
|
+
export interface IMaterial {
|
|
200
|
+
layerName: string;
|
|
201
|
+
url: string;
|
|
202
|
+
sourceName?: string;
|
|
203
|
+
}
|
|
204
|
+
export interface IFabricScreenshot {
|
|
205
|
+
id: number;
|
|
206
|
+
url: string;
|
|
207
|
+
}
|
|
208
|
+
export interface IRenderByJson {
|
|
209
|
+
psdJson: IPsdJsonData;
|
|
210
|
+
materialList: IMaterial[];
|
|
211
|
+
fabricScreenshotList: IFabricScreenshot[];
|
|
212
|
+
width?: number;
|
|
213
|
+
height?: number;
|
|
214
|
+
/** 可选:图片资源的基准 URL,用于解析相对路径 */
|
|
215
|
+
baseUrl?: string;
|
|
216
|
+
}
|