react-native-mask-segment-canvas 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.
- package/README.md +904 -0
- package/dist/components/MaskSegmentCanvas.d.ts +6 -0
- package/dist/components/MaskSegmentCanvas.d.ts.map +1 -0
- package/dist/components/MaskSegmentCanvas.js +2012 -0
- package/dist/components/MaskSegmentCanvas.js.map +1 -0
- package/dist/components/MaskSegmentCanvas.types.d.ts +189 -0
- package/dist/components/MaskSegmentCanvas.types.d.ts.map +1 -0
- package/dist/components/MaskSegmentCanvas.types.js +2 -0
- package/dist/components/MaskSegmentCanvas.types.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/shaders/regionPaint.sksl.d.ts +3 -0
- package/dist/shaders/regionPaint.sksl.d.ts.map +1 -0
- package/dist/shaders/regionPaint.sksl.js +72 -0
- package/dist/shaders/regionPaint.sksl.js.map +1 -0
- package/dist/utils/compositePaintedImage.d.ts +44 -0
- package/dist/utils/compositePaintedImage.d.ts.map +1 -0
- package/dist/utils/compositePaintedImage.js +146 -0
- package/dist/utils/compositePaintedImage.js.map +1 -0
- package/dist/utils/exportUtils.d.ts +20 -0
- package/dist/utils/exportUtils.d.ts.map +1 -0
- package/dist/utils/exportUtils.js +32 -0
- package/dist/utils/exportUtils.js.map +1 -0
- package/dist/utils/freqLayerPrep.d.ts +23 -0
- package/dist/utils/freqLayerPrep.d.ts.map +1 -0
- package/dist/utils/freqLayerPrep.js +168 -0
- package/dist/utils/freqLayerPrep.js.map +1 -0
- package/dist/utils/maskSegmentRuntime.d.ts +43 -0
- package/dist/utils/maskSegmentRuntime.d.ts.map +1 -0
- package/dist/utils/maskSegmentRuntime.js +181 -0
- package/dist/utils/maskSegmentRuntime.js.map +1 -0
- package/dist/utils/maskSegmentation.d.ts +133 -0
- package/dist/utils/maskSegmentation.d.ts.map +1 -0
- package/dist/utils/maskSegmentation.js +1600 -0
- package/dist/utils/maskSegmentation.js.map +1 -0
- package/dist/utils/maskSemanticPalette.d.ts +31 -0
- package/dist/utils/maskSemanticPalette.d.ts.map +1 -0
- package/dist/utils/maskSemanticPalette.js +125 -0
- package/dist/utils/maskSemanticPalette.js.map +1 -0
- package/dist/utils/opencvAdapter.d.ts +116 -0
- package/dist/utils/opencvAdapter.d.ts.map +1 -0
- package/dist/utils/opencvAdapter.js +353 -0
- package/dist/utils/opencvAdapter.js.map +1 -0
- package/dist/utils/paintColorMapTexture.d.ts +5 -0
- package/dist/utils/paintColorMapTexture.d.ts.map +1 -0
- package/dist/utils/paintColorMapTexture.js +203 -0
- package/dist/utils/paintColorMapTexture.js.map +1 -0
- package/dist/utils/paintShaderRuntime.d.ts +40 -0
- package/dist/utils/paintShaderRuntime.d.ts.map +1 -0
- package/dist/utils/paintShaderRuntime.js +76 -0
- package/dist/utils/paintShaderRuntime.js.map +1 -0
- package/dist/utils/pickMapTexture.d.ts +4 -0
- package/dist/utils/pickMapTexture.d.ts.map +1 -0
- package/dist/utils/pickMapTexture.js +24 -0
- package/dist/utils/pickMapTexture.js.map +1 -0
- package/dist/utils/pngImage.d.ts +49 -0
- package/dist/utils/pngImage.d.ts.map +1 -0
- package/dist/utils/pngImage.js +438 -0
- package/dist/utils/pngImage.js.map +1 -0
- package/dist/utils/resolveAssetPath.d.ts +3 -0
- package/dist/utils/resolveAssetPath.d.ts.map +1 -0
- package/dist/utils/resolveAssetPath.js +56 -0
- package/dist/utils/resolveAssetPath.js.map +1 -0
- package/dist/utils/resolveImageUrl.d.ts +3 -0
- package/dist/utils/resolveImageUrl.d.ts.map +1 -0
- package/dist/utils/resolveImageUrl.js +51 -0
- package/dist/utils/resolveImageUrl.js.map +1 -0
- package/dist/utils/skiaImage.d.ts +4 -0
- package/dist/utils/skiaImage.d.ts.map +1 -0
- package/dist/utils/skiaImage.js +12 -0
- package/dist/utils/skiaImage.js.map +1 -0
- package/package.json +100 -0
- package/patches/react-native-fast-opencv+0.4.8.patch +122 -0
- package/src/components/MaskSegmentCanvas.tsx +2832 -0
- package/src/components/MaskSegmentCanvas.types.ts +216 -0
- package/src/globals.d.ts +19 -0
- package/src/index.ts +45 -0
- package/src/shaders/regionPaint.sksl.ts +71 -0
- package/src/upng-js.d.ts +33 -0
- package/src/utils/compositePaintedImage.ts +201 -0
- package/src/utils/exportUtils.ts +40 -0
- package/src/utils/freqLayerPrep.ts +267 -0
- package/src/utils/maskSegmentRuntime.ts +257 -0
- package/src/utils/maskSegmentation.ts +2294 -0
- package/src/utils/maskSemanticPalette.ts +187 -0
- package/src/utils/opencvAdapter.ts +539 -0
- package/src/utils/paintColorMapTexture.ts +239 -0
- package/src/utils/paintShaderRuntime.tsx +150 -0
- package/src/utils/pickMapTexture.ts +37 -0
- package/src/utils/pngImage.ts +591 -0
- package/src/utils/resolveAssetPath.ts +64 -0
- package/src/utils/resolveImageUrl.ts +63 -0
- package/src/utils/skiaImage.ts +25 -0
|
@@ -0,0 +1,353 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenCV 便捷适配层
|
|
3
|
+
* 将 react-native-fast-opencv 的 invoke API 封装为 MaskSegmentCanvas 所需的 async 风格接口
|
|
4
|
+
*/
|
|
5
|
+
import RNFS from 'react-native-fs';
|
|
6
|
+
import { OpenCV, ObjectType, DataTypes, ColorConversionCodes, ThresholdTypes, MorphShapes, MorphTypes, RetrievalModes, ContourApproximationModes, InterpolationFlags, } from 'react-native-fast-opencv';
|
|
7
|
+
import { PNG_COMPRESSION, ensureMat8U, ensurePngFile, isPngPath, normalizePath, pngCacheName, readPngBgrBuffer, readPngHeaderFromBase64, } from './pngImage';
|
|
8
|
+
import { rgbaBufferToSkiaImage } from './skiaImage';
|
|
9
|
+
const IMREAD_GRAYSCALE = 0;
|
|
10
|
+
export class WrappedMat {
|
|
11
|
+
mat;
|
|
12
|
+
cols;
|
|
13
|
+
rows;
|
|
14
|
+
channels;
|
|
15
|
+
constructor(mat, cols, rows, channels = 3) {
|
|
16
|
+
this.mat = mat;
|
|
17
|
+
this.cols = cols;
|
|
18
|
+
this.rows = rows;
|
|
19
|
+
this.channels = channels;
|
|
20
|
+
}
|
|
21
|
+
release() {
|
|
22
|
+
OpenCV.releaseBuffers([this.mat.id]);
|
|
23
|
+
}
|
|
24
|
+
async clone() {
|
|
25
|
+
const cloned = OpenCV.invoke('clone', this.mat);
|
|
26
|
+
return new WrappedMat(cloned, this.cols, this.rows, this.channels);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
export class ContourWrapper {
|
|
30
|
+
pointVector;
|
|
31
|
+
constructor(pointVector) {
|
|
32
|
+
this.pointVector = pointVector;
|
|
33
|
+
}
|
|
34
|
+
release() {
|
|
35
|
+
OpenCV.releaseBuffers([this.pointVector.id]);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
function createScalar(a, b, c) {
|
|
39
|
+
if (b === undefined) {
|
|
40
|
+
return OpenCV.createObject(ObjectType.Scalar, a);
|
|
41
|
+
}
|
|
42
|
+
if (c === undefined) {
|
|
43
|
+
return OpenCV.createObject(ObjectType.Scalar, a, b, 0);
|
|
44
|
+
}
|
|
45
|
+
return OpenCV.createObject(ObjectType.Scalar, a, b, c);
|
|
46
|
+
}
|
|
47
|
+
async function readImageFromPath(path, grayscale = false) {
|
|
48
|
+
const filePath = normalizePath(path);
|
|
49
|
+
const base64 = await RNFS.readFile(filePath, 'base64');
|
|
50
|
+
const srcMat = OpenCV.base64ToMat(base64);
|
|
51
|
+
// 16-bit PNG 降级: toJSValue 可能崩溃,先解析 PNG 头
|
|
52
|
+
let pngHeader;
|
|
53
|
+
try {
|
|
54
|
+
pngHeader = readPngHeaderFromBase64(base64);
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
// 非 PNG 不传
|
|
58
|
+
}
|
|
59
|
+
const { mat, extraReleaseIds } = ensureMat8U(srcMat, pngHeader);
|
|
60
|
+
const info = OpenCV.toJSValue(mat);
|
|
61
|
+
if (grayscale) {
|
|
62
|
+
const gray = OpenCV.createObject(ObjectType.Mat, info.rows, info.cols, DataTypes.CV_8UC1);
|
|
63
|
+
OpenCV.invoke('cvtColor', mat, gray, ColorConversionCodes.COLOR_BGR2GRAY);
|
|
64
|
+
OpenCV.releaseBuffers([
|
|
65
|
+
...new Set([srcMat.id, mat.id, ...extraReleaseIds]),
|
|
66
|
+
]);
|
|
67
|
+
return new WrappedMat(gray, info.cols, info.rows, 1);
|
|
68
|
+
}
|
|
69
|
+
const channels = info.type === DataTypes.CV_8UC1
|
|
70
|
+
? 1
|
|
71
|
+
: info.type === DataTypes.CV_8UC4
|
|
72
|
+
? 4
|
|
73
|
+
: 3;
|
|
74
|
+
if (mat.id !== srcMat.id) {
|
|
75
|
+
OpenCV.releaseBuffers([srcMat.id]);
|
|
76
|
+
}
|
|
77
|
+
return new WrappedMat(mat, info.cols, info.rows, channels);
|
|
78
|
+
}
|
|
79
|
+
function createSize(width, height) {
|
|
80
|
+
return OpenCV.createObject(ObjectType.Size, width, height);
|
|
81
|
+
}
|
|
82
|
+
/** OpenCV GaussianBlur 要求核宽高为正奇数 */
|
|
83
|
+
function normalizeGaussianKernel(size) {
|
|
84
|
+
const n = Math.max(1, Math.round(size));
|
|
85
|
+
return n % 2 === 0 ? n + 1 : n;
|
|
86
|
+
}
|
|
87
|
+
const cv = {
|
|
88
|
+
IMREAD_GRAYSCALE,
|
|
89
|
+
THRESH_BINARY: ThresholdTypes.THRESH_BINARY,
|
|
90
|
+
MORPH_RECT: MorphShapes.MORPH_RECT,
|
|
91
|
+
MORPH_ELLIPSE: MorphShapes.MORPH_ELLIPSE,
|
|
92
|
+
MORPH_OPEN: MorphTypes.MORPH_OPEN,
|
|
93
|
+
MORPH_CLOSE: MorphTypes.MORPH_CLOSE,
|
|
94
|
+
RETR_EXTERNAL: RetrievalModes.RETR_EXTERNAL,
|
|
95
|
+
CHAIN_APPROX_SIMPLE: ContourApproximationModes.CHAIN_APPROX_SIMPLE,
|
|
96
|
+
CHAIN_APPROX_NONE: ContourApproximationModes.CHAIN_APPROX_NONE,
|
|
97
|
+
COLOR_BGR2GRAY: ColorConversionCodes.COLOR_BGR2GRAY,
|
|
98
|
+
COLOR_BGR2Lab: ColorConversionCodes.COLOR_BGR2Lab,
|
|
99
|
+
COLOR_Lab2BGR: ColorConversionCodes.COLOR_Lab2BGR,
|
|
100
|
+
COLOR_GRAY2BGR: ColorConversionCodes.COLOR_GRAY2BGR,
|
|
101
|
+
CV_8UC1: DataTypes.CV_8UC1,
|
|
102
|
+
CV_16SC1: DataTypes.CV_16SC1,
|
|
103
|
+
INTER_LINEAR: InterpolationFlags.INTER_LINEAR,
|
|
104
|
+
INTER_NEAREST: InterpolationFlags.INTER_NEAREST,
|
|
105
|
+
async ensurePngPath(path, cacheFileName) {
|
|
106
|
+
const name = cacheFileName ?? pngCacheName(path, 'img');
|
|
107
|
+
return ensurePngFile(path, name);
|
|
108
|
+
},
|
|
109
|
+
async imread(path, flags) {
|
|
110
|
+
const filePath = normalizePath(path);
|
|
111
|
+
if (isPngPath(filePath) && (await RNFS.exists(filePath))) {
|
|
112
|
+
if (flags === IMREAD_GRAYSCALE) {
|
|
113
|
+
return readImageFromPath(filePath, true);
|
|
114
|
+
}
|
|
115
|
+
const { buffer, cols, rows } = await readPngBgrBuffer(filePath);
|
|
116
|
+
return cv.bgrBufferToMat(buffer, cols, rows);
|
|
117
|
+
}
|
|
118
|
+
const pngPath = await ensurePngFile(path, pngCacheName(path, 'imread'));
|
|
119
|
+
if (flags === IMREAD_GRAYSCALE) {
|
|
120
|
+
return readImageFromPath(pngPath, true);
|
|
121
|
+
}
|
|
122
|
+
const { buffer, cols, rows } = await readPngBgrBuffer(pngPath);
|
|
123
|
+
return cv.bgrBufferToMat(buffer, cols, rows);
|
|
124
|
+
},
|
|
125
|
+
createMat(cols, rows, channels = 1) {
|
|
126
|
+
const type = channels === 1
|
|
127
|
+
? DataTypes.CV_8UC1
|
|
128
|
+
: channels === 3
|
|
129
|
+
? DataTypes.CV_8UC3
|
|
130
|
+
: DataTypes.CV_8UC4;
|
|
131
|
+
const mat = OpenCV.createObject(ObjectType.Mat, rows, cols, type);
|
|
132
|
+
return new WrappedMat(mat, cols, rows, channels);
|
|
133
|
+
},
|
|
134
|
+
async cvtColor(src, code) {
|
|
135
|
+
const dst = cv.createMat(src.cols, src.rows, 1);
|
|
136
|
+
OpenCV.invoke('cvtColor', src.mat, dst.mat, code);
|
|
137
|
+
return dst;
|
|
138
|
+
},
|
|
139
|
+
/** 三通道色彩空间转换(BGR/Lab 等) */
|
|
140
|
+
cvtColorBgr(src, code) {
|
|
141
|
+
const dst = cv.createMat(src.cols, src.rows, 3);
|
|
142
|
+
OpenCV.invoke('cvtColor', src.mat, dst.mat, code);
|
|
143
|
+
return dst;
|
|
144
|
+
},
|
|
145
|
+
/** 灰度 Mat → 三通道 BGR(供 Skia 显示) */
|
|
146
|
+
grayToBgr(src) {
|
|
147
|
+
const dst = cv.createMat(src.cols, src.rows, 3);
|
|
148
|
+
OpenCV.invoke('cvtColor', src.mat, dst.mat, ColorConversionCodes.COLOR_GRAY2BGR);
|
|
149
|
+
return dst;
|
|
150
|
+
},
|
|
151
|
+
/** 掩码统一为三通道 BGR;已是 3 通道则原样返回,色序由分割侧 swapBr 检测 */
|
|
152
|
+
async ensureBgr3(src) {
|
|
153
|
+
if (src.channels === 3) {
|
|
154
|
+
return src;
|
|
155
|
+
}
|
|
156
|
+
const dst = cv.createMat(src.cols, src.rows, 3);
|
|
157
|
+
const code = src.channels === 4
|
|
158
|
+
? ColorConversionCodes.COLOR_BGRA2BGR
|
|
159
|
+
: ColorConversionCodes.COLOR_GRAY2BGR;
|
|
160
|
+
OpenCV.invoke('cvtColor', src.mat, dst.mat, code);
|
|
161
|
+
return dst;
|
|
162
|
+
},
|
|
163
|
+
/** JS 二值缓冲(0/255)→ 单通道 Mat */
|
|
164
|
+
binaryBufferToMat(buffer, cols, rows) {
|
|
165
|
+
const mat = OpenCV.bufferToMat('uint8', rows, cols, 1, buffer);
|
|
166
|
+
return new WrappedMat(mat, cols, rows, 1);
|
|
167
|
+
},
|
|
168
|
+
/** 连续 BGR 缓冲 → 三通道 Mat */
|
|
169
|
+
bgrBufferToMat(buffer, cols, rows) {
|
|
170
|
+
const mat = OpenCV.bufferToMat('uint8', rows, cols, 3, buffer);
|
|
171
|
+
return new WrappedMat(mat, cols, rows, 3);
|
|
172
|
+
},
|
|
173
|
+
/** 将 JS 侧生成的灰度二值图写入临时 PGM 并读回 Mat */
|
|
174
|
+
async grayBufferToMat(gray, cols, rows) {
|
|
175
|
+
const path = `${RNFS.CachesDirectoryPath}/seg_bin_${Date.now()}.pgm`;
|
|
176
|
+
const header = `P5\n${cols} ${rows}\n255\n`;
|
|
177
|
+
const headerBytes = new TextEncoder().encode(header);
|
|
178
|
+
const fileBytes = new Uint8Array(headerBytes.length + gray.length);
|
|
179
|
+
fileBytes.set(headerBytes, 0);
|
|
180
|
+
fileBytes.set(gray, headerBytes.length);
|
|
181
|
+
let binary = '';
|
|
182
|
+
const chunkSize = 8192;
|
|
183
|
+
for (let i = 0; i < fileBytes.length; i += chunkSize) {
|
|
184
|
+
const slice = fileBytes.subarray(i, i + chunkSize);
|
|
185
|
+
binary += String.fromCharCode(...slice);
|
|
186
|
+
}
|
|
187
|
+
await RNFS.writeFile(path, btoa(binary), 'base64');
|
|
188
|
+
try {
|
|
189
|
+
return readImageFromPath(path, true);
|
|
190
|
+
}
|
|
191
|
+
finally {
|
|
192
|
+
if (await RNFS.exists(path)) {
|
|
193
|
+
await RNFS.unlink(path);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
},
|
|
197
|
+
/**
|
|
198
|
+
* 导出 Mat 像素。先 clone 保证内存连续,避免原生 matToBuffer 忽略 step 导致行错位。
|
|
199
|
+
*/
|
|
200
|
+
matToBuffer(src) {
|
|
201
|
+
const continuous = OpenCV.invoke('clone', src.mat);
|
|
202
|
+
try {
|
|
203
|
+
const { buffer, cols, rows, channels } = OpenCV.matToBuffer(continuous, 'uint8');
|
|
204
|
+
return { buffer, cols, rows, channels };
|
|
205
|
+
}
|
|
206
|
+
finally {
|
|
207
|
+
OpenCV.releaseBuffers([continuous.id]);
|
|
208
|
+
}
|
|
209
|
+
},
|
|
210
|
+
async inRangeBgr(src, color, tolerance, dst) {
|
|
211
|
+
const lower = createScalar(Math.max(0, color.b - tolerance), Math.max(0, color.g - tolerance), Math.max(0, color.r - tolerance));
|
|
212
|
+
const upper = createScalar(Math.min(255, color.b + tolerance), Math.min(255, color.g + tolerance), Math.min(255, color.r + tolerance));
|
|
213
|
+
OpenCV.invoke('inRange', src.mat, lower, upper, dst.mat);
|
|
214
|
+
},
|
|
215
|
+
async resize(src, dst, size, interpolation = InterpolationFlags.INTER_LINEAR) {
|
|
216
|
+
const dsize = createSize(size.width, size.height);
|
|
217
|
+
OpenCV.invoke('resize', src.mat, dst.mat, dsize, 0, 0, interpolation);
|
|
218
|
+
dst.cols = size.width;
|
|
219
|
+
dst.rows = size.height;
|
|
220
|
+
},
|
|
221
|
+
/** BGR 缓冲原生缩放(掩码用语义色,默认最近邻) */
|
|
222
|
+
async resizeBgrBuffer(buffer, srcCols, srcRows, dstCols, dstRows, interpolation = InterpolationFlags.INTER_NEAREST) {
|
|
223
|
+
if (srcCols === dstCols && srcRows === dstRows) {
|
|
224
|
+
return buffer;
|
|
225
|
+
}
|
|
226
|
+
const srcMat = cv.bgrBufferToMat(buffer, srcCols, srcRows);
|
|
227
|
+
const dstMat = cv.createMat(dstCols, dstRows, 3);
|
|
228
|
+
try {
|
|
229
|
+
await cv.resize(srcMat, dstMat, { width: dstCols, height: dstRows }, interpolation);
|
|
230
|
+
return cv.matToBuffer(dstMat).buffer;
|
|
231
|
+
}
|
|
232
|
+
finally {
|
|
233
|
+
srcMat.release();
|
|
234
|
+
dstMat.release();
|
|
235
|
+
}
|
|
236
|
+
},
|
|
237
|
+
/** BGR Mat → RGBA 连续缓冲(供 Skia 直传) */
|
|
238
|
+
async matToRgbaBuffer(src) {
|
|
239
|
+
const dst = cv.createMat(src.cols, src.rows, 4);
|
|
240
|
+
try {
|
|
241
|
+
OpenCV.invoke('cvtColor', src.mat, dst.mat, ColorConversionCodes.COLOR_BGR2RGBA);
|
|
242
|
+
const { buffer, cols, rows } = cv.matToBuffer(dst);
|
|
243
|
+
return { buffer, cols, rows };
|
|
244
|
+
}
|
|
245
|
+
finally {
|
|
246
|
+
dst.release();
|
|
247
|
+
}
|
|
248
|
+
},
|
|
249
|
+
/** BGR Mat → Skia 图像(跳过低频/高频 PNG 编码) */
|
|
250
|
+
async matToSkiaImage(src) {
|
|
251
|
+
const { buffer, cols, rows } = await cv.matToRgbaBuffer(src);
|
|
252
|
+
return rgbaBufferToSkiaImage(buffer, cols, rows);
|
|
253
|
+
},
|
|
254
|
+
/** 单通道灰度 Mat → Skia RGBA(跳过 BGR 伪彩 + 四通道 matToBuffer) */
|
|
255
|
+
grayMatToSkiaImage(src) {
|
|
256
|
+
const { buffer, cols, rows } = cv.matToBuffer(src);
|
|
257
|
+
const pixelCount = cols * rows;
|
|
258
|
+
const rgba = new Uint8Array(pixelCount * 4);
|
|
259
|
+
for (let i = 0; i < pixelCount; i++) {
|
|
260
|
+
const value = buffer[i];
|
|
261
|
+
const offset = i * 4;
|
|
262
|
+
rgba[offset] = value;
|
|
263
|
+
rgba[offset + 1] = value;
|
|
264
|
+
rgba[offset + 2] = value;
|
|
265
|
+
rgba[offset + 3] = 255;
|
|
266
|
+
}
|
|
267
|
+
return rgbaBufferToSkiaImage(rgba, cols, rows);
|
|
268
|
+
},
|
|
269
|
+
/** 连续 BGR 缓冲 → Skia 图像(工作分辨率原图 / 高低频,复用 OpenCV 解码结果) */
|
|
270
|
+
async bgrBufferToSkiaImage(buffer, cols, rows) {
|
|
271
|
+
const mat = cv.bgrBufferToMat(buffer, cols, rows);
|
|
272
|
+
try {
|
|
273
|
+
return await cv.matToSkiaImage(mat);
|
|
274
|
+
}
|
|
275
|
+
finally {
|
|
276
|
+
mat.release();
|
|
277
|
+
}
|
|
278
|
+
},
|
|
279
|
+
async threshold(src, dst, thresh, maxval, type) {
|
|
280
|
+
OpenCV.invoke('threshold', src.mat, dst.mat, thresh, maxval, type);
|
|
281
|
+
},
|
|
282
|
+
async getStructuringElement(shape, ksize) {
|
|
283
|
+
const size = createSize(ksize.width, ksize.height);
|
|
284
|
+
const kernel = OpenCV.invoke('getStructuringElement', shape, size);
|
|
285
|
+
return new WrappedMat(kernel, ksize.width, ksize.height, 1);
|
|
286
|
+
},
|
|
287
|
+
async morphologyEx(src, dst, op, kernel) {
|
|
288
|
+
OpenCV.invoke('morphologyEx', src.mat, dst.mat, op, kernel.mat);
|
|
289
|
+
},
|
|
290
|
+
async findContours(image, mode, method) {
|
|
291
|
+
const contours = OpenCV.createObject(ObjectType.PointVectorOfVectors);
|
|
292
|
+
OpenCV.invoke('findContours', image.mat, contours, mode, method);
|
|
293
|
+
const data = OpenCV.toJSValue(contours);
|
|
294
|
+
const wrappers = data.array.map((_, index) => {
|
|
295
|
+
const pv = OpenCV.copyObjectFromVector(contours, index);
|
|
296
|
+
return new ContourWrapper(pv);
|
|
297
|
+
});
|
|
298
|
+
OpenCV.releaseBuffers([contours.id]);
|
|
299
|
+
return wrappers;
|
|
300
|
+
},
|
|
301
|
+
async contourArea(contour) {
|
|
302
|
+
const result = OpenCV.invoke('contourArea', contour.pointVector, false);
|
|
303
|
+
return result.value;
|
|
304
|
+
},
|
|
305
|
+
async boundingRect(contour) {
|
|
306
|
+
const rect = OpenCV.invoke('boundingRect', contour.pointVector);
|
|
307
|
+
const js = OpenCV.toJSValue(rect);
|
|
308
|
+
return { x: js.x, y: js.y, width: js.width, height: js.height };
|
|
309
|
+
},
|
|
310
|
+
async arcLength(contour, closed) {
|
|
311
|
+
const result = OpenCV.invoke('arcLength', contour.pointVector, closed);
|
|
312
|
+
return result.value;
|
|
313
|
+
},
|
|
314
|
+
async approxPolyDP(contour, epsilon, closed) {
|
|
315
|
+
const approx = OpenCV.createObject(ObjectType.PointVector);
|
|
316
|
+
try {
|
|
317
|
+
OpenCV.invoke('approxPolyDP', contour.pointVector, approx, epsilon, closed);
|
|
318
|
+
return OpenCV.toJSValue(approx).array;
|
|
319
|
+
}
|
|
320
|
+
finally {
|
|
321
|
+
OpenCV.releaseBuffers([approx.id]);
|
|
322
|
+
}
|
|
323
|
+
},
|
|
324
|
+
async GaussianBlur(src, dst, ksize, sigma) {
|
|
325
|
+
const width = normalizeGaussianKernel(ksize.width);
|
|
326
|
+
const height = normalizeGaussianKernel(ksize.height);
|
|
327
|
+
const size = createSize(width, height);
|
|
328
|
+
OpenCV.invoke('GaussianBlur', src.mat, dst.mat, size, sigma);
|
|
329
|
+
},
|
|
330
|
+
extractChannel(src, dst, channel) {
|
|
331
|
+
OpenCV.invoke('extractChannel', src.mat, dst.mat, channel);
|
|
332
|
+
},
|
|
333
|
+
convertTo(src, dst, rtype, alpha = 1, beta = 0) {
|
|
334
|
+
OpenCV.invoke('convertTo', src.mat, dst.mat, rtype, alpha, beta);
|
|
335
|
+
},
|
|
336
|
+
async subtract(src1, src2, dst) {
|
|
337
|
+
OpenCV.invoke('subtract', src1.mat, src2.mat, dst.mat);
|
|
338
|
+
},
|
|
339
|
+
async addWeighted(src1, alpha, src2, beta, gamma, dst) {
|
|
340
|
+
if (src2) {
|
|
341
|
+
OpenCV.invoke('addWeighted', src1.mat, alpha, src2.mat, beta, gamma, dst.mat);
|
|
342
|
+
}
|
|
343
|
+
else {
|
|
344
|
+
OpenCV.invoke('addWeighted', src1.mat, alpha, src1.mat, 0, gamma, dst.mat);
|
|
345
|
+
}
|
|
346
|
+
},
|
|
347
|
+
async imwrite(path, mat) {
|
|
348
|
+
const filePath = normalizePath(path);
|
|
349
|
+
OpenCV.saveMatToFile(mat.mat, filePath, 'png', PNG_COMPRESSION);
|
|
350
|
+
},
|
|
351
|
+
};
|
|
352
|
+
export default cv;
|
|
353
|
+
//# sourceMappingURL=opencvAdapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opencvAdapter.js","sourceRoot":"","sources":["../../src/utils/opencvAdapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { type SkImage } from '@shopify/react-native-skia';
|
|
2
|
+
import type { BgrColor } from '../components/MaskSegmentCanvas.types';
|
|
3
|
+
/** 按 pickMap 展开的上色颜色图(与 pick 同尺寸,未上色像素 a=0)。支持 maskFeather 产生软边缘 alpha。 */
|
|
4
|
+
export declare function buildPaintColorMapImage(pickBuffer: Uint8Array, cols: number, rows: number, paintedRegions: Map<number, BgrColor>, featherRadius?: number): SkImage;
|
|
5
|
+
//# sourceMappingURL=paintColorMapTexture.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paintColorMapTexture.d.ts","sourceRoot":"","sources":["../../src/utils/paintColorMapTexture.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,OAAO,EACb,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uCAAuC,CAAC;AA4ItE,2EAA2E;AAC3E,wBAAgB,uBAAuB,CACrC,UAAU,EAAE,UAAU,EACtB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,EACrC,aAAa,SAAI,GAChB,OAAO,CAqFT"}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import { Skia, AlphaType, ColorType, } from '@shopify/react-native-skia';
|
|
2
|
+
/**
|
|
3
|
+
* Separable box blur on premultiplied RGBA (4-channel 0-255).
|
|
4
|
+
* Feather radius in pixels (at the working pick buffer resolution).
|
|
5
|
+
* Works on premultiplied values so that color naturally diffuses alongside alpha
|
|
6
|
+
* into the feather region — preventing "scatter dots" at resolution-mismatched boundaries.
|
|
7
|
+
*/
|
|
8
|
+
function boxBlurRgbaPremul(rgba, cols, rows, radius) {
|
|
9
|
+
const r = Math.max(1, Math.min(16, Math.round(radius)));
|
|
10
|
+
const tmp = new Uint8Array(cols * rows * 4);
|
|
11
|
+
const dst = new Uint8Array(cols * rows * 4);
|
|
12
|
+
// Horizontal pass
|
|
13
|
+
for (let y = 0; y < rows; y++) {
|
|
14
|
+
for (let x = 0; x < cols; x++) {
|
|
15
|
+
let sumR = 0, sumG = 0, sumB = 0, sumA = 0;
|
|
16
|
+
let cnt = 0;
|
|
17
|
+
const base = y * cols * 4;
|
|
18
|
+
for (let dx = -r; dx <= r; dx++) {
|
|
19
|
+
const xx = x + dx;
|
|
20
|
+
if (xx >= 0 && xx < cols) {
|
|
21
|
+
const idx = base + xx * 4;
|
|
22
|
+
sumR += rgba[idx];
|
|
23
|
+
sumG += rgba[idx + 1];
|
|
24
|
+
sumB += rgba[idx + 2];
|
|
25
|
+
sumA += rgba[idx + 3];
|
|
26
|
+
cnt++;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
const o = base + x * 4;
|
|
30
|
+
tmp[o] = Math.round(sumR / cnt);
|
|
31
|
+
tmp[o + 1] = Math.round(sumG / cnt);
|
|
32
|
+
tmp[o + 2] = Math.round(sumB / cnt);
|
|
33
|
+
tmp[o + 3] = Math.round(sumA / cnt);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
// Vertical pass
|
|
37
|
+
for (let x = 0; x < cols; x++) {
|
|
38
|
+
for (let y = 0; y < rows; y++) {
|
|
39
|
+
let sumR = 0, sumG = 0, sumB = 0, sumA = 0;
|
|
40
|
+
let cnt = 0;
|
|
41
|
+
for (let dy = -r; dy <= r; dy++) {
|
|
42
|
+
const yy = y + dy;
|
|
43
|
+
if (yy >= 0 && yy < rows) {
|
|
44
|
+
const idx = yy * cols * 4 + x * 4;
|
|
45
|
+
sumR += tmp[idx];
|
|
46
|
+
sumG += tmp[idx + 1];
|
|
47
|
+
sumB += tmp[idx + 2];
|
|
48
|
+
sumA += tmp[idx + 3];
|
|
49
|
+
cnt++;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
const o = y * cols * 4 + x * 4;
|
|
53
|
+
dst[o] = Math.round(sumR / cnt);
|
|
54
|
+
dst[o + 1] = Math.round(sumG / cnt);
|
|
55
|
+
dst[o + 2] = Math.round(sumB / cnt);
|
|
56
|
+
dst[o + 3] = Math.round(sumA / cnt);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return dst;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Separable dilation (max filter) on premultiplied RGBA.
|
|
63
|
+
* Fills small holes (alpha=0) inside painted regions by taking the
|
|
64
|
+
* per-channel maximum in the neighborhood. Applied after boxBlur to
|
|
65
|
+
* eliminate scatter dots caused by segmentation gaps in the pick buffer.
|
|
66
|
+
*/
|
|
67
|
+
function dilateRgbaPremul(rgba, cols, rows, radius) {
|
|
68
|
+
const r = Math.max(1, Math.min(8, Math.round(radius)));
|
|
69
|
+
const tmp = new Uint8Array(cols * rows * 4);
|
|
70
|
+
const dst = new Uint8Array(cols * rows * 4);
|
|
71
|
+
// Horizontal pass
|
|
72
|
+
for (let y = 0; y < rows; y++) {
|
|
73
|
+
for (let x = 0; x < cols; x++) {
|
|
74
|
+
let maxR = 0, maxG = 0, maxB = 0, maxA = 0;
|
|
75
|
+
const base = y * cols * 4;
|
|
76
|
+
for (let dx = -r; dx <= r; dx++) {
|
|
77
|
+
const xx = x + dx;
|
|
78
|
+
if (xx >= 0 && xx < cols) {
|
|
79
|
+
const idx = base + xx * 4;
|
|
80
|
+
if (rgba[idx + 3] > maxA) {
|
|
81
|
+
maxR = rgba[idx];
|
|
82
|
+
maxG = rgba[idx + 1];
|
|
83
|
+
maxB = rgba[idx + 2];
|
|
84
|
+
maxA = rgba[idx + 3];
|
|
85
|
+
}
|
|
86
|
+
else if (rgba[idx + 3] === maxA && maxA > 0) {
|
|
87
|
+
maxR = Math.max(maxR, rgba[idx]);
|
|
88
|
+
maxG = Math.max(maxG, rgba[idx + 1]);
|
|
89
|
+
maxB = Math.max(maxB, rgba[idx + 2]);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
const o = base + x * 4;
|
|
94
|
+
tmp[o] = maxR;
|
|
95
|
+
tmp[o + 1] = maxG;
|
|
96
|
+
tmp[o + 2] = maxB;
|
|
97
|
+
tmp[o + 3] = maxA;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
// Vertical pass
|
|
101
|
+
for (let x = 0; x < cols; x++) {
|
|
102
|
+
for (let y = 0; y < rows; y++) {
|
|
103
|
+
let maxR = 0, maxG = 0, maxB = 0, maxA = 0;
|
|
104
|
+
for (let dy = -r; dy <= r; dy++) {
|
|
105
|
+
const yy = y + dy;
|
|
106
|
+
if (yy >= 0 && yy < rows) {
|
|
107
|
+
const idx = yy * cols * 4 + x * 4;
|
|
108
|
+
if (tmp[idx + 3] > maxA) {
|
|
109
|
+
maxR = tmp[idx];
|
|
110
|
+
maxG = tmp[idx + 1];
|
|
111
|
+
maxB = tmp[idx + 2];
|
|
112
|
+
maxA = tmp[idx + 3];
|
|
113
|
+
}
|
|
114
|
+
else if (tmp[idx + 3] === maxA && maxA > 0) {
|
|
115
|
+
maxR = Math.max(maxR, tmp[idx]);
|
|
116
|
+
maxG = Math.max(maxG, tmp[idx + 1]);
|
|
117
|
+
maxB = Math.max(maxB, tmp[idx + 2]);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
const o = y * cols * 4 + x * 4;
|
|
122
|
+
dst[o] = maxR;
|
|
123
|
+
dst[o + 1] = maxG;
|
|
124
|
+
dst[o + 2] = maxB;
|
|
125
|
+
dst[o + 3] = maxA;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return dst;
|
|
129
|
+
}
|
|
130
|
+
/** 按 pickMap 展开的上色颜色图(与 pick 同尺寸,未上色像素 a=0)。支持 maskFeather 产生软边缘 alpha。 */
|
|
131
|
+
export function buildPaintColorMapImage(pickBuffer, cols, rows, paintedRegions, featherRadius = 0) {
|
|
132
|
+
const pixelCount = cols * rows;
|
|
133
|
+
const colorByPickCode = new Map();
|
|
134
|
+
for (const [regionId, color] of paintedRegions) {
|
|
135
|
+
colorByPickCode.set(regionId + 1, color);
|
|
136
|
+
}
|
|
137
|
+
// ── Perf fast-path: no feather → 1-pass direct unpremul RGBA (O(N)) ──
|
|
138
|
+
// Skips premul buffer, boxBlur H+V, dilate H+V, and unpremul conversion.
|
|
139
|
+
// The GPU shader handles boundary noise via unpremultiply (rgb /= a) +
|
|
140
|
+
// smoothstep gate, so no CPU-side dilate/filter is needed.
|
|
141
|
+
if (featherRadius <= 0.1 && featherRadius >= -0.1) {
|
|
142
|
+
const rgba = new Uint8Array(pixelCount * 4);
|
|
143
|
+
for (let i = 0; i < pixelCount; i++) {
|
|
144
|
+
const code = pickBuffer[i];
|
|
145
|
+
const color = code > 0 ? colorByPickCode.get(code) : undefined;
|
|
146
|
+
const o = i * 4;
|
|
147
|
+
if (color) {
|
|
148
|
+
rgba[o] = color.r;
|
|
149
|
+
rgba[o + 1] = color.g;
|
|
150
|
+
rgba[o + 2] = color.b;
|
|
151
|
+
rgba[o + 3] = 255;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
const data = Skia.Data.fromBytes(rgba);
|
|
155
|
+
return Skia.Image.MakeImage({ width: cols, height: rows, alphaType: AlphaType.Unpremul, colorType: ColorType.RGBA_8888 }, data, cols * 4);
|
|
156
|
+
}
|
|
157
|
+
// ── Feathered path: premul + boxBlur + dilate + unpremul ──
|
|
158
|
+
// Build hard premultiplied RGBA: where a pick code maps to a painted color,
|
|
159
|
+
// store (R, G, B, 255) in premul space. Unpainted pixels stay (0,0,0,0).
|
|
160
|
+
const hardPremul = new Uint8Array(pixelCount * 4);
|
|
161
|
+
for (let i = 0; i < pixelCount; i++) {
|
|
162
|
+
const code = pickBuffer[i];
|
|
163
|
+
const color = code > 0 ? colorByPickCode.get(code) : undefined;
|
|
164
|
+
const o = i * 4;
|
|
165
|
+
if (color) {
|
|
166
|
+
hardPremul[o] = color.r;
|
|
167
|
+
hardPremul[o + 1] = color.g;
|
|
168
|
+
hardPremul[o + 2] = color.b;
|
|
169
|
+
hardPremul[o + 3] = 255;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
// Box-blur premultiplied RGBA so color naturally diffuses alongside alpha
|
|
173
|
+
// into the feather region. This prevents scatter dots from bilinear
|
|
174
|
+
// interpolation at resolution-mismatched boundaries (where unpainted=black
|
|
175
|
+
// would otherwise leak into boundary samples).
|
|
176
|
+
const blurredPremul = boxBlurRgbaPremul(hardPremul, cols, rows, featherRadius);
|
|
177
|
+
// Dilation pass: fill small holes (alpha=0) inside painted regions that
|
|
178
|
+
// survive the box blur due to segmentation gaps in the pick buffer.
|
|
179
|
+
const filledPremul = dilateRgbaPremul(blurredPremul, cols, rows, featherRadius);
|
|
180
|
+
// Unpremultiply and store as RGBA for the final SkImage.
|
|
181
|
+
const rgba = new Uint8Array(pixelCount * 4);
|
|
182
|
+
for (let i = 0; i < pixelCount; i++) {
|
|
183
|
+
const o = i * 4;
|
|
184
|
+
const a = filledPremul[o + 3];
|
|
185
|
+
if (a > 0) {
|
|
186
|
+
rgba[o] = Math.min(255, Math.round((filledPremul[o] * 255) / a));
|
|
187
|
+
rgba[o + 1] = Math.min(255, Math.round((filledPremul[o + 1] * 255) / a));
|
|
188
|
+
rgba[o + 2] = Math.min(255, Math.round((filledPremul[o + 2] * 255) / a));
|
|
189
|
+
rgba[o + 3] = a;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
const data = Skia.Data.fromBytes(rgba);
|
|
193
|
+
return Skia.Image.MakeImage({
|
|
194
|
+
width: cols,
|
|
195
|
+
height: rows,
|
|
196
|
+
// Unpremul: rgb stores the target paint color (unmodulated), alpha stores coverage (soft edge feather).
|
|
197
|
+
// This ensures ImageShader sampling returns the intended paint color + separate coverage alpha,
|
|
198
|
+
// without premultiplication assumptions that could cause dark fringes on soft edges.
|
|
199
|
+
alphaType: AlphaType.Unpremul,
|
|
200
|
+
colorType: ColorType.RGBA_8888,
|
|
201
|
+
}, data, cols * 4);
|
|
202
|
+
}
|
|
203
|
+
//# sourceMappingURL=paintColorMapTexture.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paintColorMapTexture.js","sourceRoot":"","sources":["../../src/utils/paintColorMapTexture.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,IAAI,EACJ,SAAS,EACT,SAAS,GAEV,MAAM,4BAA4B,CAAC;AAGpC;;;;;GAKG;AACH,SAAS,iBAAiB,CACxB,IAAgB,EAChB,IAAY,EACZ,IAAY,EACZ,MAAc;IAEd,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACxD,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC;IAC5C,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC;IAC5C,kBAAkB;IAClB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE;QAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE;YAC7B,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC;YAC3C,IAAI,GAAG,GAAG,CAAC,CAAC;YACZ,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC;YAC1B,KAAK,IAAI,EAAE,GAAG,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE;gBAC/B,MAAM,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC;gBAClB,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI,EAAE;oBACxB,MAAM,GAAG,GAAG,IAAI,GAAG,EAAE,GAAG,CAAC,CAAC;oBAC1B,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC;oBAClB,IAAI,IAAI,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;oBACtB,IAAI,IAAI,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;oBACtB,IAAI,IAAI,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;oBACtB,GAAG,EAAE,CAAC;iBACP;aACF;YACD,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;YACvB,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC;YAChC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC;YACpC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC;YACpC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC;SACrC;KACF;IACD,gBAAgB;IAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE;QAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE;YAC7B,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC;YAC3C,IAAI,GAAG,GAAG,CAAC,CAAC;YACZ,KAAK,IAAI,EAAE,GAAG,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE;gBAC/B,MAAM,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC;gBAClB,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI,EAAE;oBACxB,MAAM,GAAG,GAAG,EAAE,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;oBAClC,IAAI,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;oBACjB,IAAI,IAAI,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;oBACrB,IAAI,IAAI,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;oBACrB,IAAI,IAAI,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;oBACrB,GAAG,EAAE,CAAC;iBACP;aACF;YACD,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC/B,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC;YAChC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC;YACpC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC;YACpC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC;SACrC;KACF;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;GAKG;AACH,SAAS,gBAAgB,CACvB,IAAgB,EAChB,IAAY,EACZ,IAAY,EACZ,MAAc;IAEd,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACvD,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC;IAC5C,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC;IAC5C,kBAAkB;IAClB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE;QAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE;YAC7B,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC;YAC3C,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC;YAC1B,KAAK,IAAI,EAAE,GAAG,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE;gBAC/B,MAAM,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC;gBAClB,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI,EAAE;oBACxB,MAAM,GAAG,GAAG,IAAI,GAAG,EAAE,GAAG,CAAC,CAAC;oBAC1B,IAAI,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE;wBACxB,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;wBACjB,IAAI,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;wBACrB,IAAI,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;wBACrB,IAAI,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;qBACtB;yBAAM,IAAI,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,GAAG,CAAC,EAAE;wBAC7C,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;wBACjC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;wBACrC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;qBACtC;iBACF;aACF;YACD,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;YACvB,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;YACd,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC;YAClB,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC;YAClB,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC;SACnB;KACF;IACD,gBAAgB;IAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE;QAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE;YAC7B,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC;YAC3C,KAAK,IAAI,EAAE,GAAG,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE;gBAC/B,MAAM,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC;gBAClB,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI,EAAE;oBACxB,MAAM,GAAG,GAAG,EAAE,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;oBAClC,IAAI,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE;wBACvB,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;wBAChB,IAAI,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;wBACpB,IAAI,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;wBACpB,IAAI,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;qBACrB;yBAAM,IAAI,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,GAAG,CAAC,EAAE;wBAC5C,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;wBAChC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;wBACpC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;qBACrC;iBACF;aACF;YACD,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC/B,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;YACd,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC;YAClB,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC;YAClB,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC;SACnB;KACF;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,uBAAuB,CACrC,UAAsB,EACtB,IAAY,EACZ,IAAY,EACZ,cAAqC,EACrC,aAAa,GAAG,CAAC;IAEjB,MAAM,UAAU,GAAG,IAAI,GAAG,IAAI,CAAC;IAC/B,MAAM,eAAe,GAAG,IAAI,GAAG,EAAoB,CAAC;IACpD,KAAK,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,cAAc,EAAE;QAC9C,eAAe,CAAC,GAAG,CAAC,QAAQ,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;KAC1C;IAED,wEAAwE;IACxE,yEAAyE;IACzE,uEAAuE;IACvE,2DAA2D;IAC3D,IAAI,aAAa,IAAI,GAAG,IAAI,aAAa,IAAI,CAAC,GAAG,EAAE;QACjD,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;QAC5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE;YACnC,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;YAC3B,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAC/D,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAChB,IAAI,KAAK,EAAE;gBACT,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;gBAClB,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;gBACtB,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;gBACtB,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;aACnB;SACF;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACvC,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CACzB,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,CAAC,SAAS,EAAE,EAC5F,IAAI,EACJ,IAAI,GAAG,CAAC,CACR,CAAC;KACJ;IAED,6DAA6D;IAC7D,4EAA4E;IAC5E,yEAAyE;IACzE,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;IAClD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE;QACnC,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;QAC3B,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC/D,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAChB,IAAI,KAAK,EAAE;YACT,UAAU,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;YACxB,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;YAC5B,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;YAC5B,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;SACzB;KACF;IAED,0EAA0E;IAC1E,oEAAoE;IACpE,2EAA2E;IAC3E,+CAA+C;IAC/C,MAAM,aAAa,GAAG,iBAAiB,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC;IAE/E,wEAAwE;IACxE,oEAAoE;IACpE,MAAM,YAAY,GAAG,gBAAgB,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC;IAEhF,yDAAyD;IACzD,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;IAC5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE;QACnC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAChB,MAAM,CAAC,GAAG,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC9B,IAAI,CAAC,GAAG,CAAC,EAAE;YACT,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACjE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACzE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACzE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;SACjB;KACF;IAED,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACvC,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CACzB;QACE,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,IAAI;QACZ,wGAAwG;QACxG,gGAAgG;QAChG,qFAAqF;QACrF,SAAS,EAAE,SAAS,CAAC,QAAQ;QAC7B,SAAS,EAAE,SAAS,CAAC,SAAS;KAC/B,EACD,IAAI,EACJ,IAAI,GAAG,CAAC,CACR,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { type SkImage, type SkRuntimeEffect } from '@shopify/react-native-skia';
|
|
3
|
+
import type { BgrColor } from '../components/MaskSegmentCanvas.types';
|
|
4
|
+
export declare function getRegionPaintEffect(): SkRuntimeEffect;
|
|
5
|
+
export type PaintShaderTextures = {
|
|
6
|
+
originImage: SkImage;
|
|
7
|
+
paintColorMap: SkImage;
|
|
8
|
+
lowFreqImage: SkImage;
|
|
9
|
+
highFreqImage: SkImage;
|
|
10
|
+
};
|
|
11
|
+
export declare function buildPaintShaderUniforms(showOrigin: boolean): {
|
|
12
|
+
colorBaseOpacity: number;
|
|
13
|
+
lLightOpacity: number;
|
|
14
|
+
textureOpacity: number;
|
|
15
|
+
showOrigin: number;
|
|
16
|
+
};
|
|
17
|
+
export type PaintShaderLayerProps = PaintShaderTextures & {
|
|
18
|
+
x: number;
|
|
19
|
+
y: number;
|
|
20
|
+
width: number;
|
|
21
|
+
height: number;
|
|
22
|
+
showOrigin?: boolean;
|
|
23
|
+
};
|
|
24
|
+
/** Canvas 内全屏上色 Shader 层 */
|
|
25
|
+
export declare function PaintShaderLayer(props: PaintShaderLayerProps): React.JSX.Element;
|
|
26
|
+
export declare function createPaintColorMapForPaint(pickBuffer: Uint8Array, cols: number, rows: number, paintedRegions: Map<number, BgrColor>): SkImage;
|
|
27
|
+
export type OffscreenPaintInput = PaintShaderTextures & {
|
|
28
|
+
width: number;
|
|
29
|
+
height: number;
|
|
30
|
+
showOrigin?: boolean;
|
|
31
|
+
};
|
|
32
|
+
/** 离屏渲染与预览同源的 shader 合成图 */
|
|
33
|
+
export declare function renderPaintedImageOffscreen(input: OffscreenPaintInput): Promise<SkImage | null>;
|
|
34
|
+
export declare function releasePaintShaderTextures(textures: {
|
|
35
|
+
originImage?: SkImage | null;
|
|
36
|
+
paintColorMap?: SkImage | null;
|
|
37
|
+
lowFreqImage?: SkImage | null;
|
|
38
|
+
highFreqImage?: SkImage | null;
|
|
39
|
+
}): void;
|
|
40
|
+
//# sourceMappingURL=paintShaderRuntime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paintShaderRuntime.d.ts","sourceRoot":"","sources":["../../src/utils/paintShaderRuntime.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAOL,KAAK,OAAO,EACZ,KAAK,eAAe,EACrB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uCAAuC,CAAC;AAMtE,wBAAgB,oBAAoB,IAAI,eAAe,CAUtD;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,WAAW,EAAE,OAAO,CAAC;IACrB,aAAa,EAAE,OAAO,CAAC;IACvB,YAAY,EAAE,OAAO,CAAC;IACtB,aAAa,EAAE,OAAO,CAAC;CACxB,CAAC;AAEF,wBAAgB,wBAAwB,CAAC,UAAU,EAAE,OAAO;;;;;EAQ3D;AAED,MAAM,MAAM,qBAAqB,GAAG,mBAAmB,GAAG;IACxD,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC;AAmCF,4BAA4B;AAC5B,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,qBAE5D;AAED,wBAAgB,2BAA2B,CACzC,UAAU,EAAE,UAAU,EACtB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,GACpC,OAAO,CAMT;AAED,MAAM,MAAM,mBAAmB,GAAG,mBAAmB,GAAG;IACtD,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF,4BAA4B;AAC5B,wBAAsB,2BAA2B,CAC/C,KAAK,EAAE,mBAAmB,GACzB,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAsBzB;AAED,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE;IACnD,WAAW,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC7B,aAAa,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC/B,YAAY,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC9B,aAAa,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;CAChC,QAKA"}
|