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.
Files changed (95) hide show
  1. package/README.md +904 -0
  2. package/dist/components/MaskSegmentCanvas.d.ts +6 -0
  3. package/dist/components/MaskSegmentCanvas.d.ts.map +1 -0
  4. package/dist/components/MaskSegmentCanvas.js +2012 -0
  5. package/dist/components/MaskSegmentCanvas.js.map +1 -0
  6. package/dist/components/MaskSegmentCanvas.types.d.ts +189 -0
  7. package/dist/components/MaskSegmentCanvas.types.d.ts.map +1 -0
  8. package/dist/components/MaskSegmentCanvas.types.js +2 -0
  9. package/dist/components/MaskSegmentCanvas.types.js.map +1 -0
  10. package/dist/index.d.ts +6 -0
  11. package/dist/index.d.ts.map +1 -0
  12. package/dist/index.js +5 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/shaders/regionPaint.sksl.d.ts +3 -0
  15. package/dist/shaders/regionPaint.sksl.d.ts.map +1 -0
  16. package/dist/shaders/regionPaint.sksl.js +72 -0
  17. package/dist/shaders/regionPaint.sksl.js.map +1 -0
  18. package/dist/utils/compositePaintedImage.d.ts +44 -0
  19. package/dist/utils/compositePaintedImage.d.ts.map +1 -0
  20. package/dist/utils/compositePaintedImage.js +146 -0
  21. package/dist/utils/compositePaintedImage.js.map +1 -0
  22. package/dist/utils/exportUtils.d.ts +20 -0
  23. package/dist/utils/exportUtils.d.ts.map +1 -0
  24. package/dist/utils/exportUtils.js +32 -0
  25. package/dist/utils/exportUtils.js.map +1 -0
  26. package/dist/utils/freqLayerPrep.d.ts +23 -0
  27. package/dist/utils/freqLayerPrep.d.ts.map +1 -0
  28. package/dist/utils/freqLayerPrep.js +168 -0
  29. package/dist/utils/freqLayerPrep.js.map +1 -0
  30. package/dist/utils/maskSegmentRuntime.d.ts +43 -0
  31. package/dist/utils/maskSegmentRuntime.d.ts.map +1 -0
  32. package/dist/utils/maskSegmentRuntime.js +181 -0
  33. package/dist/utils/maskSegmentRuntime.js.map +1 -0
  34. package/dist/utils/maskSegmentation.d.ts +133 -0
  35. package/dist/utils/maskSegmentation.d.ts.map +1 -0
  36. package/dist/utils/maskSegmentation.js +1600 -0
  37. package/dist/utils/maskSegmentation.js.map +1 -0
  38. package/dist/utils/maskSemanticPalette.d.ts +31 -0
  39. package/dist/utils/maskSemanticPalette.d.ts.map +1 -0
  40. package/dist/utils/maskSemanticPalette.js +125 -0
  41. package/dist/utils/maskSemanticPalette.js.map +1 -0
  42. package/dist/utils/opencvAdapter.d.ts +116 -0
  43. package/dist/utils/opencvAdapter.d.ts.map +1 -0
  44. package/dist/utils/opencvAdapter.js +353 -0
  45. package/dist/utils/opencvAdapter.js.map +1 -0
  46. package/dist/utils/paintColorMapTexture.d.ts +5 -0
  47. package/dist/utils/paintColorMapTexture.d.ts.map +1 -0
  48. package/dist/utils/paintColorMapTexture.js +203 -0
  49. package/dist/utils/paintColorMapTexture.js.map +1 -0
  50. package/dist/utils/paintShaderRuntime.d.ts +40 -0
  51. package/dist/utils/paintShaderRuntime.d.ts.map +1 -0
  52. package/dist/utils/paintShaderRuntime.js +76 -0
  53. package/dist/utils/paintShaderRuntime.js.map +1 -0
  54. package/dist/utils/pickMapTexture.d.ts +4 -0
  55. package/dist/utils/pickMapTexture.d.ts.map +1 -0
  56. package/dist/utils/pickMapTexture.js +24 -0
  57. package/dist/utils/pickMapTexture.js.map +1 -0
  58. package/dist/utils/pngImage.d.ts +49 -0
  59. package/dist/utils/pngImage.d.ts.map +1 -0
  60. package/dist/utils/pngImage.js +438 -0
  61. package/dist/utils/pngImage.js.map +1 -0
  62. package/dist/utils/resolveAssetPath.d.ts +3 -0
  63. package/dist/utils/resolveAssetPath.d.ts.map +1 -0
  64. package/dist/utils/resolveAssetPath.js +56 -0
  65. package/dist/utils/resolveAssetPath.js.map +1 -0
  66. package/dist/utils/resolveImageUrl.d.ts +3 -0
  67. package/dist/utils/resolveImageUrl.d.ts.map +1 -0
  68. package/dist/utils/resolveImageUrl.js +51 -0
  69. package/dist/utils/resolveImageUrl.js.map +1 -0
  70. package/dist/utils/skiaImage.d.ts +4 -0
  71. package/dist/utils/skiaImage.d.ts.map +1 -0
  72. package/dist/utils/skiaImage.js +12 -0
  73. package/dist/utils/skiaImage.js.map +1 -0
  74. package/package.json +100 -0
  75. package/patches/react-native-fast-opencv+0.4.8.patch +122 -0
  76. package/src/components/MaskSegmentCanvas.tsx +2832 -0
  77. package/src/components/MaskSegmentCanvas.types.ts +216 -0
  78. package/src/globals.d.ts +19 -0
  79. package/src/index.ts +45 -0
  80. package/src/shaders/regionPaint.sksl.ts +71 -0
  81. package/src/upng-js.d.ts +33 -0
  82. package/src/utils/compositePaintedImage.ts +201 -0
  83. package/src/utils/exportUtils.ts +40 -0
  84. package/src/utils/freqLayerPrep.ts +267 -0
  85. package/src/utils/maskSegmentRuntime.ts +257 -0
  86. package/src/utils/maskSegmentation.ts +2294 -0
  87. package/src/utils/maskSemanticPalette.ts +187 -0
  88. package/src/utils/opencvAdapter.ts +539 -0
  89. package/src/utils/paintColorMapTexture.ts +239 -0
  90. package/src/utils/paintShaderRuntime.tsx +150 -0
  91. package/src/utils/pickMapTexture.ts +37 -0
  92. package/src/utils/pngImage.ts +591 -0
  93. package/src/utils/resolveAssetPath.ts +64 -0
  94. package/src/utils/resolveImageUrl.ts +63 -0
  95. 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":"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"}
@@ -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"}