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,76 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Skia, Fill, Shader, ImageShader, Group, drawAsImage, } from '@shopify/react-native-skia';
|
|
3
|
+
import { REGION_PAINT_SKSL } from '../shaders/regionPaint.sksl';
|
|
4
|
+
import { getMaskSegmentRuntimeConfig } from './maskSegmentRuntime';
|
|
5
|
+
import { buildPaintColorMapImage } from './paintColorMapTexture';
|
|
6
|
+
let cachedEffect = null;
|
|
7
|
+
export function getRegionPaintEffect() {
|
|
8
|
+
if (cachedEffect) {
|
|
9
|
+
return cachedEffect;
|
|
10
|
+
}
|
|
11
|
+
const effect = Skia.RuntimeEffect.Make(REGION_PAINT_SKSL);
|
|
12
|
+
if (!effect) {
|
|
13
|
+
throw new Error('regionPaint SkSL compile failed');
|
|
14
|
+
}
|
|
15
|
+
cachedEffect = effect;
|
|
16
|
+
return effect;
|
|
17
|
+
}
|
|
18
|
+
export function buildPaintShaderUniforms(showOrigin) {
|
|
19
|
+
const paintCfg = getMaskSegmentRuntimeConfig().paint;
|
|
20
|
+
return {
|
|
21
|
+
colorBaseOpacity: paintCfg.colorBaseOpacity,
|
|
22
|
+
lLightOpacity: paintCfg.lLightOpacity,
|
|
23
|
+
textureOpacity: paintCfg.textureOpacity,
|
|
24
|
+
showOrigin: showOrigin ? 1 : 0,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
function createPaintShaderTree(props) {
|
|
28
|
+
const { originImage, paintColorMap, lowFreqImage, highFreqImage, x, y, width, height, showOrigin = false, } = props;
|
|
29
|
+
const effect = getRegionPaintEffect();
|
|
30
|
+
const uniforms = buildPaintShaderUniforms(showOrigin);
|
|
31
|
+
const imageShaderProps = {
|
|
32
|
+
fit: 'fill',
|
|
33
|
+
tx: 'clamp',
|
|
34
|
+
ty: 'clamp',
|
|
35
|
+
rect: { x, y, width, height },
|
|
36
|
+
};
|
|
37
|
+
return (_jsx(Fill, { children: _jsxs(Shader, { source: effect, uniforms: uniforms, children: [_jsx(ImageShader, { image: originImage, ...imageShaderProps }), _jsx(ImageShader, { image: paintColorMap, ...imageShaderProps }), _jsx(ImageShader, { image: lowFreqImage, ...imageShaderProps }), _jsx(ImageShader, { image: highFreqImage, ...imageShaderProps })] }) }));
|
|
38
|
+
}
|
|
39
|
+
/** Canvas 内全屏上色 Shader 层 */
|
|
40
|
+
export function PaintShaderLayer(props) {
|
|
41
|
+
return createPaintShaderTree(props);
|
|
42
|
+
}
|
|
43
|
+
export function createPaintColorMapForPaint(pickBuffer, cols, rows, paintedRegions) {
|
|
44
|
+
const paintCfg = getMaskSegmentRuntimeConfig().paint;
|
|
45
|
+
// Prefer color feather for the recolor application alpha (controls soft edge blend for both base color and texture overlay).
|
|
46
|
+
// texture feather kept in config for future differentiation (e.g. high-freq strength roll-off).
|
|
47
|
+
const feather = paintCfg.maskFeatherColor ?? 0;
|
|
48
|
+
return buildPaintColorMapImage(pickBuffer, cols, rows, paintedRegions, feather);
|
|
49
|
+
}
|
|
50
|
+
/** 离屏渲染与预览同源的 shader 合成图 */
|
|
51
|
+
export async function renderPaintedImageOffscreen(input) {
|
|
52
|
+
const { width, height, showOrigin = false, ...textures } = input;
|
|
53
|
+
if (!textures.originImage || !textures.paintColorMap || !textures.lowFreqImage || !textures.highFreqImage) {
|
|
54
|
+
console.warn('[VIZ-SAVE] renderPaintedImageOffscreen: missing one or more shader textures, will fallback');
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
// drawAsImage expects the *scene content*, not a <Canvas> host component.
|
|
58
|
+
// Passing a <Canvas> could cause the internal player to construct paints with
|
|
59
|
+
// undefined values (leading to k.charAt errors in color/enum code).
|
|
60
|
+
const element = (_jsx(Group, { children: createPaintShaderTree({
|
|
61
|
+
...textures,
|
|
62
|
+
x: 0,
|
|
63
|
+
y: 0,
|
|
64
|
+
width,
|
|
65
|
+
height,
|
|
66
|
+
showOrigin,
|
|
67
|
+
}) }));
|
|
68
|
+
return drawAsImage(element, { width, height });
|
|
69
|
+
}
|
|
70
|
+
export function releasePaintShaderTextures(textures) {
|
|
71
|
+
textures.originImage?.dispose();
|
|
72
|
+
textures.paintColorMap?.dispose();
|
|
73
|
+
textures.lowFreqImage?.dispose();
|
|
74
|
+
textures.highFreqImage?.dispose();
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=paintShaderRuntime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paintShaderRuntime.js","sourceRoot":"","sources":["../../src/utils/paintShaderRuntime.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pickMapTexture.d.ts","sourceRoot":"","sources":["../../src/utils/pickMapTexture.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,OAAO,EACb,MAAM,4BAA4B,CAAC;AAEpC,iDAAiD;AACjD,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,UAAU,EACtB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,GACX,OAAO,GAAG,IAAI,CAwBhB"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { Skia, AlphaType, ColorType, } from '@shopify/react-native-skia';
|
|
2
|
+
/** pickMap 像素值 regionId+1 → RGBA 纹理(R 通道存查表码) */
|
|
3
|
+
export function pickBufferToSkImage(pickBuffer, cols, rows) {
|
|
4
|
+
if (pickBuffer.length !== cols * rows) {
|
|
5
|
+
return null;
|
|
6
|
+
}
|
|
7
|
+
const rgba = new Uint8Array(cols * rows * 4);
|
|
8
|
+
for (let i = 0; i < pickBuffer.length; i++) {
|
|
9
|
+
const o = i * 4;
|
|
10
|
+
const code = pickBuffer[i];
|
|
11
|
+
rgba[o] = code;
|
|
12
|
+
rgba[o + 1] = code;
|
|
13
|
+
rgba[o + 2] = code;
|
|
14
|
+
rgba[o + 3] = 255;
|
|
15
|
+
}
|
|
16
|
+
const data = Skia.Data.fromBytes(rgba);
|
|
17
|
+
return Skia.Image.MakeImage({
|
|
18
|
+
width: cols,
|
|
19
|
+
height: rows,
|
|
20
|
+
alphaType: AlphaType.Opaque,
|
|
21
|
+
colorType: ColorType.RGBA_8888,
|
|
22
|
+
}, data, cols * 4);
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=pickMapTexture.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pickMapTexture.js","sourceRoot":"","sources":["../../src/utils/pickMapTexture.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,IAAI,EACJ,SAAS,EACT,SAAS,GAEV,MAAM,4BAA4B,CAAC;AAEpC,iDAAiD;AACjD,MAAM,UAAU,mBAAmB,CACjC,UAAsB,EACtB,IAAY,EACZ,IAAY;IAEZ,IAAI,UAAU,CAAC,MAAM,KAAK,IAAI,GAAG,IAAI,EAAE;QACrC,OAAO,IAAI,CAAC;KACb;IACD,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC;IAC7C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QAC1C,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAChB,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;QAC3B,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;QACf,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;KACnB;IACD,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,SAAS,EAAE,SAAS,CAAC,MAAM;QAC3B,SAAS,EAAE,SAAS,CAAC,SAAS;KAC/B,EACD,IAAI,EACJ,IAAI,GAAG,CAAC,CACT,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { type Mat } from 'react-native-fast-opencv';
|
|
2
|
+
export declare const PNG_EXT = ".png";
|
|
3
|
+
/** PNG 压缩级别 0 = 无损 */
|
|
4
|
+
export declare const PNG_COMPRESSION = 0;
|
|
5
|
+
export declare function normalizePath(path: string): string;
|
|
6
|
+
/** Skia useImage 需要 URI;OpenCV / RNFS 使用裸路径 */
|
|
7
|
+
export declare function toSkiaUri(path: string | null | undefined): string | null;
|
|
8
|
+
export declare function toPngFileName(name: string): string;
|
|
9
|
+
export declare function isPngPath(path: string): boolean;
|
|
10
|
+
/** 按文件元数据生成指纹,避免整文件读入(原 base64 全量哈希在 1.5MB 图上极慢) */
|
|
11
|
+
export declare function fileContentFingerprint(path: string): Promise<string>;
|
|
12
|
+
/** 任意图片路径 → 缓存目录下的 PNG 文件路径(已是 PNG 则复制,否则解码转存) */
|
|
13
|
+
export declare function ensurePngFile(sourcePath: string, cacheFileName: string): Promise<string>;
|
|
14
|
+
/** 根据源路径生成稳定 PNG 缓存名 */
|
|
15
|
+
export declare function pngCacheName(sourcePath: string, prefix: string): string;
|
|
16
|
+
/** 清理分割/OpenCV 派生缓存,保留原图与掩码源文件 */
|
|
17
|
+
export declare function clearDerivedImageCache(): Promise<number>;
|
|
18
|
+
type PngHeader = {
|
|
19
|
+
width: number;
|
|
20
|
+
height: number;
|
|
21
|
+
bitDepth: number;
|
|
22
|
+
colorType: number;
|
|
23
|
+
};
|
|
24
|
+
/** 从 base64 解析 PNG IHDR(不依赖 OpenCV),用于 16-bit Mat toJSValue 崩溃时的降级通路 */
|
|
25
|
+
export declare function readPngHeaderFromBase64(base64: string): PngHeader;
|
|
26
|
+
/** 16-bit / float Mat → 8-bit(fast-opencv 在 patch 前 toJSValue 会截断高位)。
|
|
27
|
+
* Semantic mask PNGs use 16-bit RGB where the label (0-255) is stored as value×257;
|
|
28
|
+
* use 1/257 scaling for 3+ channel 16-bit cases so the resulting 8-bit channels contain
|
|
29
|
+
* the original semantic label values (consistent with the native ensure8U patch).
|
|
30
|
+
*
|
|
31
|
+
* pngHeader 可选:当 toJSValue 因 16-bit Mat 崩溃时,用 PNG 文件头信息做降级转换,
|
|
32
|
+
* 绕过原生 toJSValue 调用。
|
|
33
|
+
*/
|
|
34
|
+
export declare function ensureMat8U(srcMat: Mat, pngHeader?: PngHeader): {
|
|
35
|
+
mat: Mat;
|
|
36
|
+
extraReleaseIds: string[];
|
|
37
|
+
};
|
|
38
|
+
export type PngBgrBuffer = {
|
|
39
|
+
buffer: Uint8Array;
|
|
40
|
+
cols: number;
|
|
41
|
+
rows: number;
|
|
42
|
+
};
|
|
43
|
+
export declare function prewarmPngBgrCache(paths: string[]): void;
|
|
44
|
+
export declare function prewarmPngBgrCacheAsync(paths: string[]): Promise<void>;
|
|
45
|
+
export declare function pngContentCacheKey(path: string): Promise<string>;
|
|
46
|
+
export declare function readPngBgrBuffer(path: string): Promise<PngBgrBuffer>;
|
|
47
|
+
export declare function resizeBgrBuffer(buffer: Uint8Array, srcCols: number, srcRows: number, dstCols: number, dstRows: number): Uint8Array;
|
|
48
|
+
export {};
|
|
49
|
+
//# sourceMappingURL=pngImage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pngImage.d.ts","sourceRoot":"","sources":["../../src/utils/pngImage.ts"],"names":[],"mappings":"AAEA,OAAO,EAKL,KAAK,GAAG,EACT,MAAM,0BAA0B,CAAC;AAElC,eAAO,MAAM,OAAO,SAAS,CAAC;AAC9B,sBAAsB;AACtB,eAAO,MAAM,eAAe,IAAI,CAAC;AAEjC,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,+CAA+C;AAC/C,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAcxE;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGlD;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE/C;AAcD,oDAAoD;AACpD,wBAAsB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAI1E;AAgCD,kDAAkD;AAClD,wBAAsB,aAAa,CACjC,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,MAAM,CAAC,CA6BjB;AAED,wBAAwB;AACxB,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAEvE;AAUD,kCAAkC;AAClC,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,MAAM,CAAC,CAgB9D;AAYD,KAAK,SAAS,GAAG;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAkBF,wEAAwE;AACxE,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAkCjE;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,GAAG,EACX,SAAS,CAAC,EAAE,SAAS,GACpB;IACD,GAAG,EAAE,GAAG,CAAC;IACT,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B,CA2EA;AAsKD,MAAM,MAAM,YAAY,GAAG;IACzB,MAAM,EAAE,UAAU,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAKF,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAKxD;AAED,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,MAAM,EAAE,GACd,OAAO,CAAC,IAAI,CAAC,CAEf;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAGtE;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAoD1E;AAED,wBAAgB,eAAe,CAC7B,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GACd,UAAU,CAkBZ"}
|
|
@@ -0,0 +1,438 @@
|
|
|
1
|
+
import RNFS from 'react-native-fs';
|
|
2
|
+
import UPNG from 'upng-js';
|
|
3
|
+
import { OpenCV, ObjectType, DataTypes, ColorConversionCodes, } from 'react-native-fast-opencv';
|
|
4
|
+
export const PNG_EXT = '.png';
|
|
5
|
+
/** PNG 压缩级别 0 = 无损 */
|
|
6
|
+
export const PNG_COMPRESSION = 0;
|
|
7
|
+
export function normalizePath(path) {
|
|
8
|
+
return path.startsWith('file://') ? path.slice(7) : path;
|
|
9
|
+
}
|
|
10
|
+
/** Skia useImage 需要 URI;OpenCV / RNFS 使用裸路径 */
|
|
11
|
+
export function toSkiaUri(path) {
|
|
12
|
+
if (!path) {
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
if (path.startsWith('http://') ||
|
|
16
|
+
path.startsWith('https://') ||
|
|
17
|
+
path.startsWith('data:') ||
|
|
18
|
+
path.startsWith('file://')) {
|
|
19
|
+
return path;
|
|
20
|
+
}
|
|
21
|
+
const normalized = normalizePath(path);
|
|
22
|
+
return `file://${normalized}`;
|
|
23
|
+
}
|
|
24
|
+
export function toPngFileName(name) {
|
|
25
|
+
const base = name.replace(/\.(jpe?g|webp|gif|bmp|heic|heif)$/i, '');
|
|
26
|
+
return base.toLowerCase().endsWith(PNG_EXT) ? base : `${base}${PNG_EXT}`;
|
|
27
|
+
}
|
|
28
|
+
export function isPngPath(path) {
|
|
29
|
+
return normalizePath(path).toLowerCase().endsWith(PNG_EXT);
|
|
30
|
+
}
|
|
31
|
+
function hashString(value) {
|
|
32
|
+
let hash = 5381;
|
|
33
|
+
for (let i = 0; i < value.length; i++) {
|
|
34
|
+
hash = Math.imul(hash, 33) ^ value.charCodeAt(i);
|
|
35
|
+
}
|
|
36
|
+
return (hash >>> 0).toString(16);
|
|
37
|
+
}
|
|
38
|
+
function hashPath(path) {
|
|
39
|
+
return hashString(path);
|
|
40
|
+
}
|
|
41
|
+
/** 按文件元数据生成指纹,避免整文件读入(原 base64 全量哈希在 1.5MB 图上极慢) */
|
|
42
|
+
export async function fileContentFingerprint(path) {
|
|
43
|
+
const normalized = normalizePath(path);
|
|
44
|
+
const stat = await RNFS.stat(normalized);
|
|
45
|
+
return hashString(`${stat.size}:${stat.mtime ?? stat.ctime}`);
|
|
46
|
+
}
|
|
47
|
+
function versionedCachePath(cacheFileName, fingerprint) {
|
|
48
|
+
const baseName = toPngFileName(cacheFileName).replace(/\.png$/i, '');
|
|
49
|
+
return `${RNFS.CachesDirectoryPath}/${baseName}_${fingerprint}${PNG_EXT}`;
|
|
50
|
+
}
|
|
51
|
+
async function cleanupStaleVersionedCache(cacheFileName, keepDest) {
|
|
52
|
+
const baseName = toPngFileName(cacheFileName).replace(/\.png$/i, '');
|
|
53
|
+
const legacyDest = `${RNFS.CachesDirectoryPath}/${toPngFileName(cacheFileName)}`;
|
|
54
|
+
const prefix = `${baseName}_`;
|
|
55
|
+
if (legacyDest !== keepDest && (await RNFS.exists(legacyDest))) {
|
|
56
|
+
await RNFS.unlink(legacyDest);
|
|
57
|
+
}
|
|
58
|
+
const files = await RNFS.readDir(RNFS.CachesDirectoryPath);
|
|
59
|
+
for (const file of files) {
|
|
60
|
+
if (file.isFile() &&
|
|
61
|
+
file.name.startsWith(prefix) &&
|
|
62
|
+
file.name.endsWith(PNG_EXT) &&
|
|
63
|
+
file.path !== keepDest) {
|
|
64
|
+
await RNFS.unlink(file.path);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/** 任意图片路径 → 缓存目录下的 PNG 文件路径(已是 PNG 则复制,否则解码转存) */
|
|
69
|
+
export async function ensurePngFile(sourcePath, cacheFileName) {
|
|
70
|
+
const src = normalizePath(sourcePath);
|
|
71
|
+
const fingerprint = await fileContentFingerprint(src);
|
|
72
|
+
const dest = versionedCachePath(cacheFileName, fingerprint);
|
|
73
|
+
if (!(await RNFS.exists(src))) {
|
|
74
|
+
throw new Error(`Image does not exist: ${src}`);
|
|
75
|
+
}
|
|
76
|
+
if (src === dest) {
|
|
77
|
+
return dest;
|
|
78
|
+
}
|
|
79
|
+
if (await RNFS.exists(dest)) {
|
|
80
|
+
return dest;
|
|
81
|
+
}
|
|
82
|
+
if (isPngPath(src)) {
|
|
83
|
+
await RNFS.copyFile(src, dest);
|
|
84
|
+
await cleanupStaleVersionedCache(cacheFileName, dest);
|
|
85
|
+
return dest;
|
|
86
|
+
}
|
|
87
|
+
const base64 = await RNFS.readFile(src, 'base64');
|
|
88
|
+
const mat = OpenCV.base64ToMat(base64);
|
|
89
|
+
OpenCV.saveMatToFile(mat, dest, 'png', PNG_COMPRESSION);
|
|
90
|
+
OpenCV.releaseBuffers([mat.id]);
|
|
91
|
+
await cleanupStaleVersionedCache(cacheFileName, dest);
|
|
92
|
+
return dest;
|
|
93
|
+
}
|
|
94
|
+
/** 根据源路径生成稳定 PNG 缓存名 */
|
|
95
|
+
export function pngCacheName(sourcePath, prefix) {
|
|
96
|
+
return `${prefix}_${hashPath(normalizePath(sourcePath))}${PNG_EXT}`;
|
|
97
|
+
}
|
|
98
|
+
const DERIVED_CACHE_PREFIXES = [
|
|
99
|
+
'seg_lowfreq_',
|
|
100
|
+
'seg_highfreq_',
|
|
101
|
+
'imread_',
|
|
102
|
+
'img_',
|
|
103
|
+
'tmp_',
|
|
104
|
+
];
|
|
105
|
+
/** 清理分割/OpenCV 派生缓存,保留原图与掩码源文件 */
|
|
106
|
+
export async function clearDerivedImageCache() {
|
|
107
|
+
const files = await RNFS.readDir(RNFS.CachesDirectoryPath);
|
|
108
|
+
let removed = 0;
|
|
109
|
+
for (const file of files) {
|
|
110
|
+
if (!file.isFile() || !file.name.endsWith(PNG_EXT)) {
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
if (!DERIVED_CACHE_PREFIXES.some(prefix => file.name.startsWith(prefix))) {
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
await RNFS.unlink(file.path);
|
|
117
|
+
removed += 1;
|
|
118
|
+
}
|
|
119
|
+
return removed;
|
|
120
|
+
}
|
|
121
|
+
const CV_MAT_DEPTH_MASK = 7;
|
|
122
|
+
function matDepth(type) {
|
|
123
|
+
return type & CV_MAT_DEPTH_MASK;
|
|
124
|
+
}
|
|
125
|
+
function matChannelsFromType(type) {
|
|
126
|
+
return (type >> 3) + 1;
|
|
127
|
+
}
|
|
128
|
+
function pngColorTypeToChannels(colorType) {
|
|
129
|
+
switch (colorType) {
|
|
130
|
+
case 0:
|
|
131
|
+
return 1;
|
|
132
|
+
case 2:
|
|
133
|
+
case 3:
|
|
134
|
+
return 3;
|
|
135
|
+
case 4:
|
|
136
|
+
return 2;
|
|
137
|
+
case 6:
|
|
138
|
+
return 4;
|
|
139
|
+
default:
|
|
140
|
+
return 3;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
/** 从 base64 解析 PNG IHDR(不依赖 OpenCV),用于 16-bit Mat toJSValue 崩溃时的降级通路 */
|
|
144
|
+
export function readPngHeaderFromBase64(base64) {
|
|
145
|
+
// PNG 签名 8 字节 + IHDR 长度 4 + "IHDR" 4 + 宽 4 + 高 4 + 位深 1 + 颜色类型 1 = 26 字节
|
|
146
|
+
// base64 每 3 字节 → 4 字符,取前 40 字符覆盖 ~30 字节
|
|
147
|
+
const headerPart = base64.slice(0, 40);
|
|
148
|
+
const binary = atob(headerPart);
|
|
149
|
+
function readUint32BE(offset) {
|
|
150
|
+
return (((binary.charCodeAt(offset) << 24) |
|
|
151
|
+
(binary.charCodeAt(offset + 1) << 16) |
|
|
152
|
+
(binary.charCodeAt(offset + 2) << 8) |
|
|
153
|
+
binary.charCodeAt(offset + 3)) >>>
|
|
154
|
+
0);
|
|
155
|
+
}
|
|
156
|
+
// 校验 PNG 签名
|
|
157
|
+
const sig = [137, 80, 78, 71, 13, 10, 26, 10];
|
|
158
|
+
for (let i = 0; i < 8; i++) {
|
|
159
|
+
if (binary.charCodeAt(i) !== sig[i]) {
|
|
160
|
+
throw new Error('Invalid PNG file (signature mismatch)');
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
const width = readUint32BE(16);
|
|
164
|
+
const height = readUint32BE(20);
|
|
165
|
+
const bitDepth = binary.charCodeAt(24);
|
|
166
|
+
const colorType = binary.charCodeAt(25);
|
|
167
|
+
if (width === 0 || height === 0) {
|
|
168
|
+
throw new Error(`Invalid PNG size: ${width}x${height}`);
|
|
169
|
+
}
|
|
170
|
+
return { width, height, bitDepth, colorType };
|
|
171
|
+
}
|
|
172
|
+
/** 16-bit / float Mat → 8-bit(fast-opencv 在 patch 前 toJSValue 会截断高位)。
|
|
173
|
+
* Semantic mask PNGs use 16-bit RGB where the label (0-255) is stored as value×257;
|
|
174
|
+
* use 1/257 scaling for 3+ channel 16-bit cases so the resulting 8-bit channels contain
|
|
175
|
+
* the original semantic label values (consistent with the native ensure8U patch).
|
|
176
|
+
*
|
|
177
|
+
* pngHeader 可选:当 toJSValue 因 16-bit Mat 崩溃时,用 PNG 文件头信息做降级转换,
|
|
178
|
+
* 绕过原生 toJSValue 调用。
|
|
179
|
+
*/
|
|
180
|
+
export function ensureMat8U(srcMat, pngHeader) {
|
|
181
|
+
let info;
|
|
182
|
+
try {
|
|
183
|
+
info = OpenCV.toJSValue(srcMat);
|
|
184
|
+
}
|
|
185
|
+
catch (toJsError) {
|
|
186
|
+
if (!pngHeader) {
|
|
187
|
+
throw new Error(`OpenCV toJSValue failed (mat id=${srcMat?.id ?? 'unknown'}): ${toJsError.message}`);
|
|
188
|
+
}
|
|
189
|
+
// 降级通路: 16-bit PNG 的 Mat 无法通过 toJSValue 读取元数据,
|
|
190
|
+
// 直接使用 PNG 文件头中的宽高和位深信息做 convertTo
|
|
191
|
+
const { width: cols, height: rows, bitDepth, colorType } = pngHeader;
|
|
192
|
+
const ch = pngColorTypeToChannels(colorType);
|
|
193
|
+
if (bitDepth <= 8) {
|
|
194
|
+
// 8-bit 或更低,不需要 convertTo,直接返回
|
|
195
|
+
return { mat: srcMat, extraReleaseIds: [] };
|
|
196
|
+
}
|
|
197
|
+
const outType = ch === 1
|
|
198
|
+
? DataTypes.CV_8UC1
|
|
199
|
+
: ch === 4
|
|
200
|
+
? DataTypes.CV_8UC4
|
|
201
|
+
: DataTypes.CV_8UC3;
|
|
202
|
+
const dstMat = OpenCV.createObject(ObjectType.Mat, rows, cols, outType);
|
|
203
|
+
// 16-bit RGB 语义掩码: 标签值 = 原始值 / 257
|
|
204
|
+
const alpha = ch >= 3 ? 1 / 257 : 255 / 65535;
|
|
205
|
+
OpenCV.invoke('convertTo', srcMat, dstMat, outType, alpha, 0);
|
|
206
|
+
return { mat: dstMat, extraReleaseIds: [dstMat.id] };
|
|
207
|
+
}
|
|
208
|
+
if (matDepth(info.type) === DataTypes.CV_8U) {
|
|
209
|
+
return { mat: srcMat, extraReleaseIds: [] };
|
|
210
|
+
}
|
|
211
|
+
const rows = info.rows;
|
|
212
|
+
const cols = info.cols;
|
|
213
|
+
const ch = matChannelsFromType(info.type);
|
|
214
|
+
const outType = ch === 1
|
|
215
|
+
? DataTypes.CV_8UC1
|
|
216
|
+
: ch === 4
|
|
217
|
+
? DataTypes.CV_8UC4
|
|
218
|
+
: ch === 2
|
|
219
|
+
? DataTypes.CV_8UC2
|
|
220
|
+
: DataTypes.CV_8UC3;
|
|
221
|
+
const dstMat = OpenCV.createObject(ObjectType.Mat, rows, cols, outType);
|
|
222
|
+
const depth = matDepth(info.type);
|
|
223
|
+
let alpha = 1;
|
|
224
|
+
if (depth === DataTypes.CV_16U || depth === DataTypes.CV_16S) {
|
|
225
|
+
// Special case for semantic mask 16-bit "RGB label" encoding (value × 257)
|
|
226
|
+
alpha = ch >= 3 ? 1 / 257 : 255 / 65535;
|
|
227
|
+
}
|
|
228
|
+
else if (depth === DataTypes.CV_32F || depth === DataTypes.CV_64F) {
|
|
229
|
+
alpha = 255;
|
|
230
|
+
}
|
|
231
|
+
OpenCV.invoke('convertTo', srcMat, dstMat, outType, alpha, 0);
|
|
232
|
+
return { mat: dstMat, extraReleaseIds: [dstMat.id] };
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* JS fallback PNG decoder (OpenCV base64ToMat may throw HostFunction for 16-bit PNGs).
|
|
236
|
+
* 16-bit RGB semantic masks use value×257 encoding → UPNG.toRGBA8 high byte = original 8-bit label.
|
|
237
|
+
*/
|
|
238
|
+
function decodePngToBgrJS(base64) {
|
|
239
|
+
const atobFn = globalThis.atob;
|
|
240
|
+
if (!atobFn) {
|
|
241
|
+
throw new Error('JS PNG fallback: atob unavailable');
|
|
242
|
+
}
|
|
243
|
+
const binary = atobFn(base64);
|
|
244
|
+
const bytes = new Uint8Array(binary.length);
|
|
245
|
+
for (let i = 0; i < binary.length; i++) {
|
|
246
|
+
bytes[i] = binary.charCodeAt(i);
|
|
247
|
+
}
|
|
248
|
+
const decoded = UPNG.decode(bytes);
|
|
249
|
+
const rgbaFrames = UPNG.toRGBA8(decoded);
|
|
250
|
+
const rgbaBuf = new Uint8Array(rgbaFrames[0]);
|
|
251
|
+
const w = decoded.width;
|
|
252
|
+
const h = decoded.height;
|
|
253
|
+
const pixelCount = w * h;
|
|
254
|
+
// RGBA → BGR (drop alpha)
|
|
255
|
+
const bgr = new Uint8Array(pixelCount * 3);
|
|
256
|
+
for (let i = 0; i < pixelCount; i++) {
|
|
257
|
+
const si = i * 4;
|
|
258
|
+
const di = i * 3;
|
|
259
|
+
bgr[di] = rgbaBuf[si + 2]; // B ← R
|
|
260
|
+
bgr[di + 1] = rgbaBuf[si + 1]; // G
|
|
261
|
+
bgr[di + 2] = rgbaBuf[si]; // R ← B
|
|
262
|
+
}
|
|
263
|
+
return { buffer: bgr, cols: w, rows: h };
|
|
264
|
+
}
|
|
265
|
+
/** Only check PNG magic bytes (89 50 4E 47) — agnostic to bit depth.
|
|
266
|
+
* OpenCV bridge may throw HostFunction for both 8-bit and 16-bit PNGs.
|
|
267
|
+
* Fall back to UPNG pure-JS decode for any valid PNG (supports all variants). */
|
|
268
|
+
function isPngByBase64Magic(base64) {
|
|
269
|
+
if (!base64 || base64.length < 8) {
|
|
270
|
+
return false;
|
|
271
|
+
}
|
|
272
|
+
try {
|
|
273
|
+
const atobFn = globalThis.atob;
|
|
274
|
+
if (!atobFn) {
|
|
275
|
+
return false;
|
|
276
|
+
}
|
|
277
|
+
const binary = atobFn(base64.slice(0, 12)); // 8 bytes → 12 base64 chars
|
|
278
|
+
return (binary.charCodeAt(0) === 0x89 &&
|
|
279
|
+
binary.charCodeAt(1) === 0x50 &&
|
|
280
|
+
binary.charCodeAt(2) === 0x4e &&
|
|
281
|
+
binary.charCodeAt(3) === 0x47);
|
|
282
|
+
}
|
|
283
|
+
catch {
|
|
284
|
+
return false;
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
/** base64 PNG → 连续 BGR 缓冲(OpenCV 原生解码,跳过 JS atob + upng) */
|
|
288
|
+
function decodeBase64PngToBgr(base64) {
|
|
289
|
+
let srcMat;
|
|
290
|
+
try {
|
|
291
|
+
srcMat = OpenCV.base64ToMat(base64);
|
|
292
|
+
}
|
|
293
|
+
catch (e) {
|
|
294
|
+
// OpenCV bridge may throw HostFunction for any PNG (8-bit or 16-bit).
|
|
295
|
+
// Fall back to pure JS decode whenever the file header is PNG.
|
|
296
|
+
if (isPngByBase64Magic(base64)) {
|
|
297
|
+
try {
|
|
298
|
+
return decodePngToBgrJS(base64);
|
|
299
|
+
}
|
|
300
|
+
catch (jsError) {
|
|
301
|
+
throw new Error(`JS PNG fallback also failed (base64 length ${base64?.length ?? 0}): ${jsError.message}`);
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
throw new Error(`OpenCV base64ToMat failed (base64 length ${base64?.length ?? 0}): ${e.message}`);
|
|
305
|
+
}
|
|
306
|
+
if (!srcMat || typeof srcMat.id !== 'string' || !srcMat.id) {
|
|
307
|
+
throw new Error(`OpenCV base64ToMat returned invalid Mat (base64 length ${base64?.length ?? 0})`);
|
|
308
|
+
}
|
|
309
|
+
const releaseIds = [srcMat.id];
|
|
310
|
+
try {
|
|
311
|
+
// 先解析 PNG 文件头(宽高、位深),供 ensureMat8U 在 16-bit toJSValue 崩溃时降级使用
|
|
312
|
+
let pngHeader;
|
|
313
|
+
try {
|
|
314
|
+
pngHeader = readPngHeaderFromBase64(base64);
|
|
315
|
+
}
|
|
316
|
+
catch {
|
|
317
|
+
// 非 PNG 或解析失败,不传 header,确保 retain 原有行为
|
|
318
|
+
}
|
|
319
|
+
let workMat;
|
|
320
|
+
let extraReleaseIds;
|
|
321
|
+
try {
|
|
322
|
+
const result = ensureMat8U(srcMat, pngHeader);
|
|
323
|
+
workMat = result.mat;
|
|
324
|
+
extraReleaseIds = result.extraReleaseIds;
|
|
325
|
+
}
|
|
326
|
+
catch (e) {
|
|
327
|
+
throw new Error(`ensureMat8U failed: ${e.message}`);
|
|
328
|
+
}
|
|
329
|
+
releaseIds.push(...extraReleaseIds);
|
|
330
|
+
const info = OpenCV.toJSValue(workMat);
|
|
331
|
+
const cols = info.cols;
|
|
332
|
+
const rows = info.rows;
|
|
333
|
+
let bgrMat = workMat;
|
|
334
|
+
if (info.type === DataTypes.CV_8UC4) {
|
|
335
|
+
bgrMat = OpenCV.createObject(ObjectType.Mat, rows, cols, DataTypes.CV_8UC3);
|
|
336
|
+
releaseIds.push(bgrMat.id);
|
|
337
|
+
OpenCV.invoke('cvtColor', workMat, bgrMat, ColorConversionCodes.COLOR_BGRA2BGR);
|
|
338
|
+
}
|
|
339
|
+
else if (info.type === DataTypes.CV_8UC1) {
|
|
340
|
+
bgrMat = OpenCV.createObject(ObjectType.Mat, rows, cols, DataTypes.CV_8UC3);
|
|
341
|
+
releaseIds.push(bgrMat.id);
|
|
342
|
+
OpenCV.invoke('cvtColor', workMat, bgrMat, ColorConversionCodes.COLOR_GRAY2BGR);
|
|
343
|
+
}
|
|
344
|
+
const continuous = OpenCV.invoke('clone', bgrMat);
|
|
345
|
+
releaseIds.push(continuous.id);
|
|
346
|
+
const { buffer, cols: outCols, rows: outRows } = OpenCV.matToBuffer(continuous, 'uint8');
|
|
347
|
+
return {
|
|
348
|
+
buffer: new Uint8Array(buffer),
|
|
349
|
+
cols: outCols,
|
|
350
|
+
rows: outRows,
|
|
351
|
+
};
|
|
352
|
+
}
|
|
353
|
+
finally {
|
|
354
|
+
OpenCV.releaseBuffers(releaseIds);
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
const pngBgrCache = new Map();
|
|
358
|
+
const prewarmInFlight = new Map();
|
|
359
|
+
export function prewarmPngBgrCache(paths) {
|
|
360
|
+
for (const path of paths) {
|
|
361
|
+
const filePath = normalizePath(path);
|
|
362
|
+
void readPngBgrBuffer(filePath).catch(() => { });
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
export async function prewarmPngBgrCacheAsync(paths) {
|
|
366
|
+
await Promise.all(paths.map(path => readPngBgrBuffer(normalizePath(path))));
|
|
367
|
+
}
|
|
368
|
+
export async function pngContentCacheKey(path) {
|
|
369
|
+
const stat = await RNFS.stat(normalizePath(path));
|
|
370
|
+
return `${stat.size}:${stat.mtime ?? stat.ctime}`;
|
|
371
|
+
}
|
|
372
|
+
export async function readPngBgrBuffer(path) {
|
|
373
|
+
const filePath = normalizePath(path);
|
|
374
|
+
const cacheKey = await pngContentCacheKey(filePath);
|
|
375
|
+
const cached = pngBgrCache.get(cacheKey);
|
|
376
|
+
if (cached) {
|
|
377
|
+
return cached;
|
|
378
|
+
}
|
|
379
|
+
const inflight = prewarmInFlight.get(cacheKey);
|
|
380
|
+
if (inflight) {
|
|
381
|
+
return inflight;
|
|
382
|
+
}
|
|
383
|
+
const loadPromise = (async () => {
|
|
384
|
+
const exists = await RNFS.exists(filePath);
|
|
385
|
+
if (!exists) {
|
|
386
|
+
throw new Error(`Image file does not exist: ${filePath}`);
|
|
387
|
+
}
|
|
388
|
+
const stat = await RNFS.stat(filePath);
|
|
389
|
+
if (stat.size === 0) {
|
|
390
|
+
throw new Error(`Image file is empty (0 bytes): ${filePath}`);
|
|
391
|
+
}
|
|
392
|
+
const base64 = await RNFS.readFile(filePath, 'base64');
|
|
393
|
+
if (!base64 || base64.length === 0) {
|
|
394
|
+
throw new Error(`Read base64 is empty: ${filePath}`);
|
|
395
|
+
}
|
|
396
|
+
let decoded;
|
|
397
|
+
try {
|
|
398
|
+
decoded = decodeBase64PngToBgr(base64);
|
|
399
|
+
}
|
|
400
|
+
catch (decodeError) {
|
|
401
|
+
throw new Error(`PNG decode failed: ${filePath} (${stat.size} bytes) - ${decodeError.message}`);
|
|
402
|
+
}
|
|
403
|
+
const entry = {
|
|
404
|
+
buffer: decoded.buffer,
|
|
405
|
+
cols: decoded.cols,
|
|
406
|
+
rows: decoded.rows,
|
|
407
|
+
};
|
|
408
|
+
pngBgrCache.set(cacheKey, entry);
|
|
409
|
+
return entry;
|
|
410
|
+
})();
|
|
411
|
+
prewarmInFlight.set(cacheKey, loadPromise);
|
|
412
|
+
try {
|
|
413
|
+
const result = await loadPromise;
|
|
414
|
+
return result;
|
|
415
|
+
}
|
|
416
|
+
finally {
|
|
417
|
+
prewarmInFlight.delete(cacheKey);
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
export function resizeBgrBuffer(buffer, srcCols, srcRows, dstCols, dstRows) {
|
|
421
|
+
if (srcCols === dstCols && srcRows === dstRows) {
|
|
422
|
+
return buffer;
|
|
423
|
+
}
|
|
424
|
+
const out = new Uint8Array(dstCols * dstRows * 3);
|
|
425
|
+
for (let y = 0; y < dstRows; y++) {
|
|
426
|
+
const sy = Math.min(srcRows - 1, Math.floor((y * srcRows) / dstRows));
|
|
427
|
+
for (let x = 0; x < dstCols; x++) {
|
|
428
|
+
const sx = Math.min(srcCols - 1, Math.floor((x * srcCols) / dstCols));
|
|
429
|
+
const si = (sy * srcCols + sx) * 3;
|
|
430
|
+
const di = (y * dstCols + x) * 3;
|
|
431
|
+
out[di] = buffer[si];
|
|
432
|
+
out[di + 1] = buffer[si + 1];
|
|
433
|
+
out[di + 2] = buffer[si + 2];
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
return out;
|
|
437
|
+
}
|
|
438
|
+
//# sourceMappingURL=pngImage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pngImage.js","sourceRoot":"","sources":["../../src/utils/pngImage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolveAssetPath.d.ts","sourceRoot":"","sources":["../../src/utils/resolveAssetPath.ts"],"names":[],"mappings":"AAIA,mDAAmD;AACnD,wBAAsB,gBAAgB,CACpC,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,MAAM,CAAC,CAuDjB"}
|