@beeintel/batch-image 0.0.0-stage → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/FONT-LICENSE.txt +93 -0
- package/README.md +181 -2
- package/dist/assets/11st-D7qGO5e4.webp +0 -0
- package/dist/assets/UPNG-CPfdwFSy.js +2298 -0
- package/dist/assets/adjust-card-B63b81iV.webp +0 -0
- package/dist/assets/adjust-final.worker-C2JbTvv5.js +6945 -0
- package/dist/assets/amazon-CjTtpZTq.webp +0 -0
- package/dist/assets/ascii_art-B4UGbtGs.webp +0 -0
- package/dist/assets/auction-j26eVUQO.webp +0 -0
- package/dist/assets/background-DGdZUdkL.webp +0 -0
- package/dist/assets/background-card-wK7DRpvM.png +0 -0
- package/dist/assets/body-CUFdRg8w.webp +0 -0
- package/dist/assets/bounded-cutout.worker-BZR6mbaI.js +9615 -0
- package/dist/assets/brand-mark-card-cFUeDeO2.webp +0 -0
- package/dist/assets/buyma-dAxYNjow.webp +0 -0
- package/dist/assets/codec.worker-7W6hmsm6.js +7349 -0
- package/dist/assets/contour_lines-C_CqrgV1.webp +0 -0
- package/dist/assets/creema-B1tWyCPx.webp +0 -0
- package/dist/assets/crop-final.worker-Owin7TvX.js +7035 -0
- package/dist/assets/cutout-CzMvV5An.webp +0 -0
- package/dist/assets/cutout-card-CN4gNFBz.png +0 -0
- package/dist/assets/cutout.worker-DyH6Prbn.js +3894 -0
- package/dist/assets/depop-CkVC5Fn1.webp +0 -0
- package/dist/assets/dewrinkle-kFzP6LqD.webp +0 -0
- package/dist/assets/dither-CcxmO2e6.webp +0 -0
- package/dist/assets/douyin-CP_HwBDF.webp +0 -0
- package/dist/assets/download.worker-DnGSB6P_.js +17779 -0
- package/dist/assets/duotone-Cdg_3fQf.webp +0 -0
- package/dist/assets/ebay-CxLfrRAf.webp +0 -0
- package/dist/assets/edit-Cv-txfZm.webp +0 -0
- package/dist/assets/effect.worker-qu1eCcII.js +9227 -0
- package/dist/assets/engraving-BENh1O2O.webp +0 -0
- package/dist/assets/etsy-CSvz9GpY.webp +0 -0
- package/dist/assets/expand-C60VE9nK.webp +0 -0
- package/dist/assets/facebook-Ca2nJJiQ.webp +0 -0
- package/dist/assets/film_stock-Bqauwcq4.webp +0 -0
- package/dist/assets/final.worker-BnzJ3N5C.js +7035 -0
- package/dist/assets/final.worker-Csc1zoYS.js +7054 -0
- package/dist/assets/final.worker-DzBFT9xk.js +6922 -0
- package/dist/assets/final.worker-XpgKnlaz.js +7217 -0
- package/dist/assets/flatlay-CPiVmlAa.webp +0 -0
- package/dist/assets/flatlay-fold-B-CRYy87.webp +0 -0
- package/dist/assets/flatlay-open-Dzas8okC.webp +0 -0
- package/dist/assets/g-market-DXuYK_JH.webp +0 -0
- package/dist/assets/ghost-BCEAx_Zx.webp +0 -0
- package/dist/assets/ghost-front-WFgA4sUo.webp +0 -0
- package/dist/assets/ghost-three-quarter-Rt8cXj34.webp +0 -0
- package/dist/assets/gif-CObOIITx.js +303 -0
- package/dist/assets/glass_tiles-3IXP-Hmg.webp +0 -0
- package/dist/assets/glitch_art-D1i3qben.webp +0 -0
- package/dist/assets/glitch_blur-C4q_9zyq.webp +0 -0
- package/dist/assets/glow-Bv9EHBU5.webp +0 -0
- package/dist/assets/gradient_map-BR-UVYMP.webp +0 -0
- package/dist/assets/halftone-CWdKu2_6.webp +0 -0
- package/dist/assets/holo_sticker-BQDikLg2.webp +0 -0
- package/dist/assets/idus-7diqRNPs.webp +0 -0
- package/dist/assets/imagetracer.worker-CgunQTPG.js +7096 -0
- package/dist/assets/instagram-Bf0IVidT.webp +0 -0
- package/dist/assets/kakao-talk-Df79L_Mv.webp +0 -0
- package/dist/assets/kaleidoscope-BxqMZuWo.webp +0 -0
- package/dist/assets/karrot-BXFPhDwt.webp +0 -0
- package/dist/assets/kaufland-BDDy6e0C.webp +0 -0
- package/dist/assets/lazada-ConR4e1O.webp +0 -0
- package/dist/assets/lens_flare-DgyiAv_j.webp +0 -0
- package/dist/assets/light_leak-kUdpoFuC.webp +0 -0
- package/dist/assets/line-Dr1j___B.webp +0 -0
- package/dist/assets/linkedin-4s_9Wh03.webp +0 -0
- package/dist/assets/lo_fi-DSdl3yY_.webp +0 -0
- package/dist/assets/logo-preparation.worker-D9oa7SME.js +420 -0
- package/dist/assets/mercado-libre-C8CskEiS.webp +0 -0
- package/dist/assets/mercari-jp-DHj7nz4O.webp +0 -0
- package/dist/assets/metadata.worker-B_9_BgN1.js +6456 -0
- package/dist/assets/mirror_collage-JtSKCeSh.webp +0 -0
- package/dist/assets/model-BbeF-fsf.webp +0 -0
- package/dist/assets/model-BjWhieit.webp +0 -0
- package/dist/assets/momo-BWXO_8Df.webp +0 -0
- package/dist/assets/motion_blur-B8YUHeSg.webp +0 -0
- package/dist/assets/naver-xQKL8lWg.webp +0 -0
- package/dist/assets/nuvemshop-DPt6rnA-.webp +0 -0
- package/dist/assets/olx-B87gp-Il.webp +0 -0
- package/dist/assets/orient-card-Da0ii6mX.webp +0 -0
- package/dist/assets/orient-final.worker-CdF5Y5zD.js +6909 -0
- package/dist/assets/orientation-preview.worker-B7uFzz3J.js +6865 -0
- package/dist/assets/ort.bundle.min-CreFV8V1.js +9311 -0
- package/dist/assets/ort.webgpu.bundle.min-CAudaHZO.js +9311 -0
- package/dist/assets/otto-market-DWZyNKJn.webp +0 -0
- package/dist/assets/paper_texture-CXphyIrs.webp +0 -0
- package/dist/assets/pinterest-ByZqih2J.webp +0 -0
- package/dist/assets/polish-DFy6LNG7.webp +0 -0
- package/dist/assets/poshmark-DnZi2vA1.webp +0 -0
- package/dist/assets/posterize-SpLVGq1s.webp +0 -0
- package/dist/assets/preview.worker-DcrCKKWl.js +380 -0
- package/dist/assets/qoo10-C1pq81Jx.webp +0 -0
- package/dist/assets/rakuten-ulYog1hL.webp +0 -0
- package/dist/assets/recolor-mBX7vdFT.webp +0 -0
- package/dist/assets/resize-DVEAl0Um.webp +0 -0
- package/dist/assets/runtime-0663b902fb3937883a34.wasm +0 -0
- package/dist/assets/runtime-355a5c80c7bfdf8737de.mjs +2817 -0
- package/dist/assets/runtime-49871f5a4409519797e1.wasm +0 -0
- package/dist/assets/runtime-74cf72f9a2b7befc115a.mjs +2817 -0
- package/dist/assets/shadow-card-DTZEH60r.png +0 -0
- package/dist/assets/shopee-Bxfei6sj.webp +0 -0
- package/dist/assets/shopify-wVaBafcF.webp +0 -0
- package/dist/assets/shopline-DMoaJ7Bh.webp +0 -0
- package/dist/assets/sparkle-CD5GSGip.webp +0 -0
- package/dist/assets/ssg-DQoFx5u5.webp +0 -0
- package/dist/assets/staging-CIc8pQJ6.webp +0 -0
- package/dist/assets/standard-cutout.worker-BYLzdpR-.js +1261 -0
- package/dist/assets/text-DQW2mBGp.webp +0 -0
- package/dist/assets/textured_glass-D2coxp7n.webp +0 -0
- package/dist/assets/tga-VGxWDes0.js +752 -0
- package/dist/assets/tilt_shift-BKs46yeX.webp +0 -0
- package/dist/assets/transformers.web-DB57cIO5.js +28891 -0
- package/dist/assets/tritone-CcR4qizk.webp +0 -0
- package/dist/assets/upscale-BrLadyUk.webp +0 -0
- package/dist/assets/upscale-creative-DnZnQufJ.webp +0 -0
- package/dist/assets/upscale-crisp-Ckdmbsnn.webp +0 -0
- package/dist/assets/vinted-1QDsxvC6.webp +0 -0
- package/dist/assets/watercolor-CV67zYNE.webp +0 -0
- package/dist/assets/watermark-CpPrxaT5.webp +0 -0
- package/dist/assets/wave_distortion-CV5jVfK4.webp +0 -0
- package/dist/assets/whatsapp-CWJxqzR6.webp +0 -0
- package/dist/assets/worker-DfrCFP3O.js +55 -0
- package/dist/assets/xerox_noise-CbbHY1S1.webp +0 -0
- package/dist/assets/youtube-DS12d5mi.webp +0 -0
- package/dist/assets/zalando-CenfWOwz.webp +0 -0
- package/dist/browser-adapter.d.ts +4 -0
- package/dist/browser-cutout-capability.d.ts +4 -0
- package/dist/browser-cutout-resources.d.ts +3 -0
- package/dist/browser-local-capabilities.d.ts +5 -0
- package/dist/capabilities.d.ts +18 -0
- package/dist/chunks/AdjustToolPanel-B6dtlFlj.js +195 -0
- package/dist/chunks/BackgroundToolPanel-C3Rr9d4S.js +41 -0
- package/dist/chunks/BatchMaterials-DDoJTaS5.js +806 -0
- package/dist/chunks/BatchModeChoices-DeBARgvY.js +111 -0
- package/dist/chunks/BatchOutputColorPicker-D7WIDS4_.js +75 -0
- package/dist/chunks/BatchReferenceFields-Cr5WgFRJ.js +316 -0
- package/dist/chunks/BeautifyToolPanel-DDZXDQKM.js +215 -0
- package/dist/chunks/BrandMarkToolPanel-vKobk_R3.js +1179 -0
- package/dist/chunks/ContentTrimControl-BKCJEst5.js +297 -0
- package/dist/chunks/CropToolPanel-C_sW5tWL.js +218 -0
- package/dist/chunks/CutoutToolPanel-B7ObmiWd.js +73 -0
- package/dist/chunks/DisclosureToolPanel-F3ccFJIF.js +76 -0
- package/dist/chunks/ExpandToolPanel-BKjj5UJA.js +67 -0
- package/dist/chunks/ImageEffectsToolPanel-CsDIBpT6.js +966 -0
- package/dist/chunks/IpAuditToolPanel-CduDfFh-.js +96 -0
- package/dist/chunks/ListingToolPanel-8pJ2_zvI.js +783 -0
- package/dist/chunks/MaterialSelectionPlate-CW7HaS6v.js +30 -0
- package/dist/chunks/MetadataToolPanel-C8XJOamN.js +104 -0
- package/dist/chunks/OrientToolPanel-C1AzQchm.js +161 -0
- package/dist/chunks/PluginActionFooter.vue_vue_type_script_setup_true_lang-BGe419qz.js +102 -0
- package/dist/chunks/ResizeToolPanel-DWikcj2G.js +1178 -0
- package/dist/chunks/RetouchToolPanel-B4eQKk2W.js +350 -0
- package/dist/chunks/ShadowToolPanel-Bbj76hQd.js +254 -0
- package/dist/chunks/SvgExportToolPanel-BRxpzd7q.js +219 -0
- package/dist/chunks/TranslationToolPanel-Bxv8U2WY.js +125 -0
- package/dist/chunks/UpscaleToolPanel-BRIgpszs.js +127 -0
- package/dist/chunks/engine-D-T-1RSx.js +69 -0
- package/dist/chunks/entry-CboOSe2r.js +42945 -0
- package/dist/chunks/gpu-CScw5MNG.js +231 -0
- package/dist/chunks/hosted-resources-COzZ7nZY.js +8196 -0
- package/dist/chunks/loader-circle-CylCgDqP.js +16 -0
- package/dist/chunks/motionFeatures-D67ghPG1.js +4405 -0
- package/dist/chunks/search-BwsDnulU.js +18 -0
- package/dist/chunks/standard-cutout-vPpP6xBc.js +45 -0
- package/dist/chunks/static-logo-2F9ORZWc.js +34 -0
- package/dist/config.d.ts +66 -0
- package/dist/contracts.d.ts +272 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.js +13 -0
- package/dist/node/catalog.mjs +45 -0
- package/dist/node/cli.mjs +11 -0
- package/dist/node/index.d.mts +20 -0
- package/dist/node/index.mjs +2 -0
- package/dist/node/prepare.mjs +114 -0
- package/dist/node/vite.mjs +46 -0
- package/dist/processing.d.ts +1 -0
- package/dist/processing.js +12105 -0
- package/dist/remote-contracts.d.ts +114 -0
- package/dist/resource-contracts.d.ts +40 -0
- package/dist/resources/cutout/9ae2e5375a34fa413530954dc20d085d175faffc86108c13619220d0557f80bf.json +1 -0
- package/dist/resources/cutout/f119dabecc64bc436d3d08425dde96ec2598fd40541eba97d8d53a4e8bbdcaea.json +1 -0
- package/dist/resources/cutout/resources.json +195 -0
- package/dist/resources/cutout/sources.json +294 -0
- package/dist/resources.json +1191 -0
- package/dist/service-contracts.d.ts +43 -0
- package/dist/slots.d.ts +21 -0
- package/dist/style.css +1 -0
- package/dist/types/batch/api.d.ts +89 -0
- package/dist/types/batch/cutout-output.d.ts +2 -0
- package/dist/types/batch/features/background/engine.d.mts +12 -0
- package/dist/types/batch/features/basic-edit/contracts.d.ts +87 -0
- package/dist/types/batch/features/basic-edit/engine.d.mts +96 -0
- package/dist/types/batch/features/brand-mark/contracts.d.ts +84 -0
- package/dist/types/batch/features/brand-mark/engine.d.mts +68 -0
- package/dist/types/batch/features/export-compression/contracts.d.ts +44 -0
- package/dist/types/batch/features/export-compression/gifenc.d.ts +33 -0
- package/dist/types/batch/features/export-compression/plan.d.ts +45 -0
- package/dist/types/batch/features/export-compression/presentation.d.ts +70 -0
- package/dist/types/batch/features/export-compression/upng.d.ts +6 -0
- package/dist/types/batch/features/final-image/resize.d.mts +15 -0
- package/dist/types/batch/features/image-effects/contracts.d.ts +58 -0
- package/dist/types/batch/features/image-effects/gpu-pixel-runtime.d.ts +15 -0
- package/dist/types/batch/features/image-effects/photo-audit.d.ts +21 -0
- package/dist/types/batch/features/image-effects/photo-v7-cpu.d.ts +9 -0
- package/dist/types/batch/features/image-effects/profiles-v4.d.ts +157 -0
- package/dist/types/batch/features/image-effects/profiles-v5.d.ts +20 -0
- package/dist/types/batch/features/image-effects/profiles-v6.d.ts +14 -0
- package/dist/types/batch/features/image-effects/profiles-v7.d.ts +53 -0
- package/dist/types/batch/features/image-effects/profiles-v8.d.ts +113 -0
- package/dist/types/batch/features/image-effects/profiles-v9.d.ts +20 -0
- package/dist/types/batch/features/image-translation/params.d.ts +257 -0
- package/dist/types/batch/features/listing-remake/transport.d.ts +21 -0
- package/dist/types/batch/features/metadata/bytes.d.mts +13 -0
- package/dist/types/batch/features/metadata/containers.d.mts +20 -0
- package/dist/types/batch/features/metadata/declaration.d.mts +5 -0
- package/dist/types/batch/features/metadata/engine.d.mts +9 -0
- package/dist/types/batch/features/metadata/exchange.d.mts +48 -0
- package/dist/types/batch/features/shadow/contracts.d.ts +43 -0
- package/dist/types/batch/features/shadow/engine.d.mts +33 -0
- package/dist/types/batch/features/svg-export/download-contract.d.ts +33 -0
- package/dist/types/batch/features/svg-export/download-prepare.d.ts +2 -0
- package/dist/types/batch/features/svg-export/download.d.ts +7 -0
- package/dist/types/batch/features/svg-export/imagetracer.d.ts +6 -0
- package/dist/types/batch/features/svg-export/optimizer.d.ts +2 -0
- package/dist/types/batch/ids.d.ts +1 -0
- package/dist/types/batch/model.d.ts +317 -0
- package/dist/types/batch/public/config.d.ts +66 -0
- package/dist/types/batch/public/contracts.d.ts +272 -0
- package/dist/types/batch/public/remote-contracts.d.ts +114 -0
- package/dist/types/batch/public/resource-contracts.d.ts +40 -0
- package/dist/types/batch/public/service-contracts.d.ts +43 -0
- package/dist/types/batch/queue.d.ts +34 -0
- package/dist/types/batch/receipts.d.ts +85 -0
- package/dist/types/batch/retention.d.ts +13 -0
- package/dist/types/onnxruntime-web.d.ts +5 -0
- package/dist/types/plugins/cutout/core/hosted-resources.d.ts +11 -0
- package/dist/types/processing.d.ts +18 -0
- package/dist/types/shared/svg-security.d.mts +4 -0
- package/dist/types/workspace-worker.d.ts +2 -0
- package/package.json +91 -3
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,420 @@
|
|
|
1
|
+
const V = Math.ceil(6400), v = 1024 * 1024, p = () => new Error("图片方向元数据无效或不完整,无法预览原始方向"), M = (t, e, n) => e + n.length <= t.length && [...n].every((a, r) => t[e + r] === a.charCodeAt(0));
|
|
2
|
+
function z(t) {
|
|
3
|
+
if (t.length < 8 || t.length > v) throw p();
|
|
4
|
+
const e = M(t, 0, "II");
|
|
5
|
+
if (!e && !M(t, 0, "MM")) throw p();
|
|
6
|
+
const n = new DataView(t.buffer, t.byteOffset, t.byteLength);
|
|
7
|
+
if (n.getUint16(2, e) !== 42) throw p();
|
|
8
|
+
const a = n.getUint32(4, e);
|
|
9
|
+
if (a < 8 || a + 2 > t.length) throw p();
|
|
10
|
+
const r = n.getUint16(a, e);
|
|
11
|
+
if (a + 2 + r * 12 + 4 > t.length) throw p();
|
|
12
|
+
let o = 1, f = !1;
|
|
13
|
+
for (let i = 0; i < r; i++) {
|
|
14
|
+
const s = a + 2 + i * 12;
|
|
15
|
+
if (n.getUint16(s, e) === 274) {
|
|
16
|
+
if (f || n.getUint16(s + 2, e) !== 3 || n.getUint32(s + 4, e) !== 1 || (o = n.getUint16(s + 8, e), o < 1 || o > 8)) throw p();
|
|
17
|
+
f = !0;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return o;
|
|
21
|
+
}
|
|
22
|
+
function H(t) {
|
|
23
|
+
if (t.length > 26214400) throw new Error("图片超过25 MiB");
|
|
24
|
+
const e = new DataView(t.buffer, t.byteOffset, t.byteLength), n = { orientation: 1, ranges: [], webp: !1 }, a = (r, o, f) => {
|
|
25
|
+
if (n.ranges.length) throw p();
|
|
26
|
+
n.orientation = z(f), n.ranges.push({ start: r, end: o });
|
|
27
|
+
};
|
|
28
|
+
if (t[0] === 255 && t[1] === 216) {
|
|
29
|
+
let r = 2, o = 0;
|
|
30
|
+
for (; r < t.length; ) {
|
|
31
|
+
if (++o > 4096 || t[r] !== 255) throw p();
|
|
32
|
+
const f = r;
|
|
33
|
+
for (; t[r] === 255; ) r++;
|
|
34
|
+
if (r >= t.length) throw p();
|
|
35
|
+
const i = t[r++];
|
|
36
|
+
if (i === 217) return n;
|
|
37
|
+
if (i === 1 || i >= 208 && i <= 215) continue;
|
|
38
|
+
if (!i || i === 216 || r + 2 > t.length) throw p();
|
|
39
|
+
const s = e.getUint16(r), l = r + s;
|
|
40
|
+
if (s < 2 || l > t.length) throw p();
|
|
41
|
+
if (i === 218) return n;
|
|
42
|
+
const g = r + 2;
|
|
43
|
+
if (i === 225 && M(t, g, "Exif")) {
|
|
44
|
+
if (s < 8 || !M(t, g, "Exif\0\0")) throw p();
|
|
45
|
+
a(f, l, t.subarray(g + 6, l));
|
|
46
|
+
}
|
|
47
|
+
r = l;
|
|
48
|
+
}
|
|
49
|
+
throw p();
|
|
50
|
+
}
|
|
51
|
+
if (t.length >= 8 && t.subarray(0, 8).every((r, o) => r === [137, 80, 78, 71, 13, 10, 26, 10][o])) {
|
|
52
|
+
let r = 8, o = 0, f = 0;
|
|
53
|
+
for (; r < t.length; ) {
|
|
54
|
+
if (r + 12 > t.length || (M(t, r + 4, "IDAT") ? ++o > V : ++f > 4096))
|
|
55
|
+
throw p();
|
|
56
|
+
const i = e.getUint32(r), s = r + 12 + i;
|
|
57
|
+
if (s > t.length) throw p();
|
|
58
|
+
if (M(t, r + 4, "eXIf") && a(r, s, t.subarray(r + 8, s - 4)), M(t, r + 4, "IEND")) {
|
|
59
|
+
if (i !== 0 || s !== t.length) throw p();
|
|
60
|
+
return n;
|
|
61
|
+
}
|
|
62
|
+
r = s;
|
|
63
|
+
}
|
|
64
|
+
throw p();
|
|
65
|
+
}
|
|
66
|
+
if (M(t, 0, "RIFF") && M(t, 8, "WEBP")) {
|
|
67
|
+
if (e.getUint32(4, !0) + 8 !== t.length) throw p();
|
|
68
|
+
n.webp = !0;
|
|
69
|
+
let r = 12, o = 0;
|
|
70
|
+
for (; r < t.length; ) {
|
|
71
|
+
if (++o > 4096 || r + 8 > t.length) throw p();
|
|
72
|
+
const f = e.getUint32(r + 4, !0), i = r + 8 + f, s = i + f % 2;
|
|
73
|
+
if (s > t.length) throw p();
|
|
74
|
+
if (M(t, r, "VP8X")) {
|
|
75
|
+
if (f !== 10 || n.webpFlags !== void 0) throw p();
|
|
76
|
+
n.webpFlags = r + 8;
|
|
77
|
+
}
|
|
78
|
+
if (M(t, r, "EXIF")) {
|
|
79
|
+
const l = r + 8;
|
|
80
|
+
a(
|
|
81
|
+
r,
|
|
82
|
+
s,
|
|
83
|
+
t.subarray(M(t, l, "Exif\0\0") ? l + 6 : l, i)
|
|
84
|
+
);
|
|
85
|
+
}
|
|
86
|
+
r = s;
|
|
87
|
+
}
|
|
88
|
+
if (n.webpFlags !== void 0 && t[n.webpFlags] & 8 && !n.ranges.length)
|
|
89
|
+
throw p();
|
|
90
|
+
return n;
|
|
91
|
+
}
|
|
92
|
+
throw p();
|
|
93
|
+
}
|
|
94
|
+
async function W(t) {
|
|
95
|
+
if (t.size > 26214400) throw new Error("图片超过25 MiB");
|
|
96
|
+
const e = new Uint8Array(await t.arrayBuffer()), n = H(e);
|
|
97
|
+
if (!n.ranges.length) return { blob: t, orientation: n.orientation };
|
|
98
|
+
const a = n.ranges.reduce((i, s) => i + s.end - s.start, 0), r = new Uint8Array(e.length - a);
|
|
99
|
+
let o = 0, f = 0;
|
|
100
|
+
for (const i of n.ranges)
|
|
101
|
+
r.set(e.subarray(o, i.start), f), f += i.start - o, o = i.end;
|
|
102
|
+
if (r.set(e.subarray(o), f), n.webp && (new DataView(r.buffer).setUint32(4, r.length - 8, !0), n.webpFlags !== void 0)) {
|
|
103
|
+
const i = n.ranges.reduce(
|
|
104
|
+
(s, l) => s + (l.end <= n.webpFlags ? l.end - l.start : 0),
|
|
105
|
+
0
|
|
106
|
+
);
|
|
107
|
+
r[n.webpFlags - i] &= -9;
|
|
108
|
+
}
|
|
109
|
+
return { blob: new Blob([r.buffer], { type: t.type }), orientation: n.orientation };
|
|
110
|
+
}
|
|
111
|
+
const k = Object.freeze({
|
|
112
|
+
version: 1,
|
|
113
|
+
upright: !0,
|
|
114
|
+
rotation: 0,
|
|
115
|
+
flipHorizontal: !1,
|
|
116
|
+
flipVertical: !1
|
|
117
|
+
});
|
|
118
|
+
function j(t, e) {
|
|
119
|
+
if (!t || typeof t != "object" || Object.getPrototypeOf(t) !== Object.prototype && Object.getPrototypeOf(t) !== null)
|
|
120
|
+
throw new Error("图片参数无效");
|
|
121
|
+
const n = Reflect.ownKeys(t);
|
|
122
|
+
if (n.length !== e.length || n.some((a) => !e.includes(a)))
|
|
123
|
+
throw new Error("图片参数字段无效");
|
|
124
|
+
}
|
|
125
|
+
function Y(t) {
|
|
126
|
+
if (!Number.isSafeInteger(t) || t < 0 || t > 4096)
|
|
127
|
+
throw new Error("透明边距须为0至4096的整数");
|
|
128
|
+
return t;
|
|
129
|
+
}
|
|
130
|
+
function R(t, e) {
|
|
131
|
+
if (!Number.isSafeInteger(t) || !Number.isSafeInteger(e) || t < 1 || e < 1 || t * e > 24e6)
|
|
132
|
+
throw new Error("图片像素尺寸无效或超过24MP");
|
|
133
|
+
}
|
|
134
|
+
function F(t, e, n) {
|
|
135
|
+
if (R(e, n), !(t instanceof Uint8ClampedArray) || t.length !== e * n * 4)
|
|
136
|
+
throw new Error("图片RGBA数据无效");
|
|
137
|
+
}
|
|
138
|
+
function B(t, e, n) {
|
|
139
|
+
F(t, e, n);
|
|
140
|
+
let a = e, r = n, o = -1, f = -1;
|
|
141
|
+
for (let i = 0; i < n; i++)
|
|
142
|
+
for (let s = 0; s < e; s++)
|
|
143
|
+
t[(i * e + s) * 4 + 3] !== 0 && (a = Math.min(a, s), r = Math.min(r, i), o = Math.max(o, s), f = Math.max(f, i));
|
|
144
|
+
return o < 0 ? { kind: "skip", reason: "fully-transparent" } : a === 0 && r === 0 && o === e - 1 && f === n - 1 ? { kind: "skip", reason: "no-transparent-border" } : {
|
|
145
|
+
kind: "crop",
|
|
146
|
+
rect: { x: a, y: r, width: o - a + 1, height: f - r + 1 }
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
function T(t, e, n, a = 0) {
|
|
150
|
+
if (R(e, n), Y(a), t.kind === "skip" && t.reason === "fully-transparent") return t;
|
|
151
|
+
const r = t.kind === "crop" ? t.rect : { x: 0, y: 0, width: e, height: n }, o = r.width + 2 * a, f = r.height + 2 * a;
|
|
152
|
+
return R(o, f), { kind: "render", sourceRect: r, width: o, height: f, padding: a };
|
|
153
|
+
}
|
|
154
|
+
function y(t, e, n, a = 0, r = "transparent") {
|
|
155
|
+
const o = T(
|
|
156
|
+
B(t, e, n),
|
|
157
|
+
e,
|
|
158
|
+
n,
|
|
159
|
+
a
|
|
160
|
+
);
|
|
161
|
+
if (o.kind === "skip") return o;
|
|
162
|
+
if ((a === 0 || r === "transparent") && o.width === e && o.height === n && o.sourceRect.x === a && o.sourceRect.y === a)
|
|
163
|
+
return { kind: "skip", reason: a === 0 ? "no-transparent-border" : "unchanged-padding" };
|
|
164
|
+
const f = new Uint8ClampedArray(o.width * o.height * 4);
|
|
165
|
+
if (a > 0 && r !== "transparent") {
|
|
166
|
+
const s = [1, 3, 5].map((l) => parseInt(r.slice(l, l + 2), 16));
|
|
167
|
+
s.push(255);
|
|
168
|
+
for (let l = 0; l < f.length; l += 4) f.set(s, l);
|
|
169
|
+
}
|
|
170
|
+
const i = o.sourceRect;
|
|
171
|
+
for (let s = 0; s < i.height; s++) {
|
|
172
|
+
const l = ((i.y + s) * e + i.x) * 4;
|
|
173
|
+
f.set(
|
|
174
|
+
t.subarray(l, l + i.width * 4),
|
|
175
|
+
((s + a) * o.width + a) * 4
|
|
176
|
+
);
|
|
177
|
+
}
|
|
178
|
+
return { kind: "image", data: f, width: o.width, height: o.height };
|
|
179
|
+
}
|
|
180
|
+
const K = {
|
|
181
|
+
0: [1, 0, 0, 1],
|
|
182
|
+
90: [0, 1, -1, 0],
|
|
183
|
+
180: [-1, 0, 0, -1],
|
|
184
|
+
270: [0, -1, 1, 0]
|
|
185
|
+
}, $ = [
|
|
186
|
+
[1, 0, 0, 1],
|
|
187
|
+
[-1, 0, 0, 1],
|
|
188
|
+
[-1, 0, 0, -1],
|
|
189
|
+
[1, 0, 0, -1],
|
|
190
|
+
[0, 1, 1, 0],
|
|
191
|
+
[0, 1, -1, 0],
|
|
192
|
+
[0, -1, -1, 0],
|
|
193
|
+
[0, -1, 1, 0]
|
|
194
|
+
];
|
|
195
|
+
function q(t) {
|
|
196
|
+
if (j(t, Object.keys(k)), t.version !== 1) throw new Error("旋转版本不受支持");
|
|
197
|
+
if (![0, 90, 180, 270].includes(t.rotation)) throw new Error("旋转角度无效");
|
|
198
|
+
if (["upright", "flipHorizontal", "flipVertical"].some((e) => typeof t[e] != "boolean"))
|
|
199
|
+
throw new Error("旋转参数无效");
|
|
200
|
+
return {
|
|
201
|
+
version: 1,
|
|
202
|
+
upright: t.upright,
|
|
203
|
+
rotation: t.rotation === 0 ? 0 : t.rotation,
|
|
204
|
+
flipHorizontal: t.flipHorizontal,
|
|
205
|
+
flipVertical: t.flipVertical
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
function J(t) {
|
|
209
|
+
const [e, n, a, r] = K[t.rotation], o = t.flipHorizontal ? -1 : 1, f = t.flipVertical ? -1 : 1;
|
|
210
|
+
return [e * o, n * f, a * o, r * f].map(
|
|
211
|
+
(i) => i === 0 ? 0 : i
|
|
212
|
+
);
|
|
213
|
+
}
|
|
214
|
+
function Z(t, e, n, a, r) {
|
|
215
|
+
const o = q(a);
|
|
216
|
+
if (F(t, e, n), !Number.isInteger(r) || r < 1 || r > 8)
|
|
217
|
+
throw new Error("图片Exif方向未知或无效");
|
|
218
|
+
let f = J(o);
|
|
219
|
+
if (o.upright) {
|
|
220
|
+
const [i, s, l, g] = $[r - 1], [I, h, m, d] = f;
|
|
221
|
+
f = [I * i + m * s, h * i + d * s, I * l + m * g, h * l + d * g].map(
|
|
222
|
+
(u) => u === 0 ? 0 : u
|
|
223
|
+
);
|
|
224
|
+
}
|
|
225
|
+
return Q(t, e, n, f);
|
|
226
|
+
}
|
|
227
|
+
function Q(t, e, n, a) {
|
|
228
|
+
const [r, o, f, i] = a, s = Math.abs(r) * e + Math.abs(f) * n, l = Math.abs(o) * e + Math.abs(i) * n;
|
|
229
|
+
if (r === 1 && o === 0 && f === 0 && i === 1)
|
|
230
|
+
return { data: new Uint8ClampedArray(t), width: e, height: n };
|
|
231
|
+
const g = new Uint8ClampedArray(t.length), I = (r < 0 ? e - 1 : 0) + (f < 0 ? n - 1 : 0), h = (o < 0 ? e - 1 : 0) + (i < 0 ? n - 1 : 0);
|
|
232
|
+
for (let m = 0; m < n; m++)
|
|
233
|
+
for (let d = 0; d < e; d++) {
|
|
234
|
+
const u = (m * e + d) * 4, c = r * d + f * m + I, A = ((o * d + i * m + h) * s + c) * 4;
|
|
235
|
+
g[A] = t[u], g[A + 1] = t[u + 1], g[A + 2] = t[u + 2], g[A + 3] = t[u + 3];
|
|
236
|
+
}
|
|
237
|
+
return { data: g, width: s, height: l };
|
|
238
|
+
}
|
|
239
|
+
const x = (t, e = 0, n = t.length) => String.fromCharCode(...t.subarray(e, n)), G = (t, e, n) => e + n.length <= t.length && [...n].every((a, r) => t[e + r] === a.charCodeAt(0)), N = (t) => new DataView(t.buffer, t.byteOffset, t.byteLength), X = new Uint32Array(256);
|
|
240
|
+
for (let t = 0; t < 256; t++) {
|
|
241
|
+
let e = t;
|
|
242
|
+
for (let n = 0; n < 8; n++) e = e >>> 1 ^ (e & 1 ? 3988292384 : 0);
|
|
243
|
+
X[t] = e;
|
|
244
|
+
}
|
|
245
|
+
function b(t) {
|
|
246
|
+
let e = 4294967295;
|
|
247
|
+
for (const n of t) e = X[(e ^ n) & 255] ^ e >>> 8;
|
|
248
|
+
return (e ^ 4294967295) >>> 0;
|
|
249
|
+
}
|
|
250
|
+
const E = (t) => {
|
|
251
|
+
throw Object.assign(new Error(t), { code: "INVALID_IMAGE" });
|
|
252
|
+
}, tt = [137, 80, 78, 71, 13, 10, 26, 10];
|
|
253
|
+
function et(t) {
|
|
254
|
+
if ((!(t instanceof Uint8Array) || t.length < 2 || t.length > 5 * 1024 * 1024) && E("Logo为空或超过5MiB限制"), t.length >= 8 && tt.every((e, n) => t[n] === e)) {
|
|
255
|
+
let e = 8, n = 0, a = !1, r = !1;
|
|
256
|
+
for (; e < t.length; ) {
|
|
257
|
+
(++n > 4096 || e + 12 > t.length) && E("Logo PNG段不完整");
|
|
258
|
+
const o = N(t).getUint32(e), f = e + 12 + o;
|
|
259
|
+
(o > 2147483647 || f > t.length) && E("Logo PNG段越界");
|
|
260
|
+
const i = x(t, e + 4, e + 8);
|
|
261
|
+
if ((!/^[A-Za-z]{4}$/.test(i) || i[2] !== i[2].toUpperCase() || b(t.subarray(e + 4, f - 4)) !== N(t).getUint32(f - 4)) && E("Logo PNG段或CRC无效"), (n === 1 && (i !== "IHDR" || o !== 13) || n > 1 && i === "IHDR") && E("Logo PNG头无效"), ["acTL", "fcTL", "fdAT"].includes(i) && E("Logo必须为静态单帧,不支持PNG动画"), i === "IDAT" ? (r && E("Logo PNG图像段顺序无效"), a = !0) : a && (r = !0), e = f, i === "IEND") {
|
|
262
|
+
(o || e !== t.length || !a) && E("Logo PNG结尾无效");
|
|
263
|
+
return;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
E("Logo PNG缺少结尾");
|
|
267
|
+
}
|
|
268
|
+
if (G(t, 0, "RIFF") && G(t, 8, "WEBP")) {
|
|
269
|
+
(t.length < 20 || N(t).getUint32(4, !0) + 8 !== t.length) && E("Logo WebP RIFF长度无效");
|
|
270
|
+
let e = 12, n = 0, a = !1;
|
|
271
|
+
for (; e < t.length; ) {
|
|
272
|
+
(++n > 4096 || e + 8 > t.length) && E("Logo WebP段不完整");
|
|
273
|
+
const r = x(t, e, e + 4), o = N(t).getUint32(e + 4, !0), f = e + 8 + o, i = f + o % 2;
|
|
274
|
+
(i > t.length || !/^[\x20-\x7e]{4}$/.test(r) || o % 2 && t[f] !== 0) && E("Logo WebP段越界或padding无效"), (r === "ANIM" || r === "ANMF") && E("Logo必须为静态单帧,不支持WebP动画"), r === "VP8X" && ((n !== 1 || a || o !== 10) && E("Logo WebP扩展头无效"), a = !0, t[e + 8] & 2 && E("Logo必须为静态单帧,不支持WebP动画")), e = i;
|
|
275
|
+
}
|
|
276
|
+
return;
|
|
277
|
+
}
|
|
278
|
+
t[0] === 255 && t[1] === 216 || E("Logo仅支持PNG、JPEG及WebP");
|
|
279
|
+
}
|
|
280
|
+
const nt = 4e6, P = 8, C = 32, U = (t, e, n) => {
|
|
281
|
+
throw Object.assign(new Error(e), { code: t, ...n ? { reason: n } : {} });
|
|
282
|
+
};
|
|
283
|
+
function rt(t, e, n) {
|
|
284
|
+
(!Number.isSafeInteger(t) || !Number.isSafeInteger(e) || t < 1 || e < 1 || t * e > n) && U("INVALID_IMAGE", "图片像素尺寸无效或超过预算");
|
|
285
|
+
}
|
|
286
|
+
function ot(t, e, n, a) {
|
|
287
|
+
rt(e, n, a), (!(t instanceof Uint8ClampedArray) || t.length !== e * n * 4) && U("INVALID_IMAGE", "图片RGBA数据无效");
|
|
288
|
+
}
|
|
289
|
+
const O = (t, e, n) => Math.max(
|
|
290
|
+
Math.abs(t[e] - n[0]),
|
|
291
|
+
Math.abs(t[e + 1] - n[1]),
|
|
292
|
+
Math.abs(t[e + 2] - n[2])
|
|
293
|
+
);
|
|
294
|
+
function it(t, e, n, a, r) {
|
|
295
|
+
const o = a % e, f = Math.floor(a / e), i = a * 4;
|
|
296
|
+
let s, l = 1 / 0;
|
|
297
|
+
for (let g = Math.max(0, f - 2); g <= Math.min(n - 1, f + 2); g++)
|
|
298
|
+
for (let I = Math.max(0, o - 2); I <= Math.min(e - 1, o + 2); I++) {
|
|
299
|
+
const h = (g * e + I) * 4;
|
|
300
|
+
if (O(t, h, r) <= C) continue;
|
|
301
|
+
const m = [t[h], t[h + 1], t[h + 2]];
|
|
302
|
+
let d = 0, u = 0;
|
|
303
|
+
for (let L = 0; L < 3; L++) {
|
|
304
|
+
const _ = m[L] - r[L];
|
|
305
|
+
d += (t[i + L] - r[L]) * _, u += _ * _;
|
|
306
|
+
}
|
|
307
|
+
const c = Math.max(0, Math.min(1, d / u)), w = Math.max(
|
|
308
|
+
...m.map(
|
|
309
|
+
(L, _) => Math.abs(
|
|
310
|
+
t[i + _] - (r[_] + c * (L - r[_]))
|
|
311
|
+
)
|
|
312
|
+
)
|
|
313
|
+
), A = (I - o) ** 2 + (g - f) ** 2 + w / P;
|
|
314
|
+
c > 0 && w <= P && A < l && (l = A, s = { fg: m, alpha: c });
|
|
315
|
+
}
|
|
316
|
+
return s;
|
|
317
|
+
}
|
|
318
|
+
function ft(t, e, n) {
|
|
319
|
+
ot(t, e, n, nt);
|
|
320
|
+
for (let c = 3; c < t.length; c += 4)
|
|
321
|
+
if (t[c] < 255)
|
|
322
|
+
return { data: new Uint8ClampedArray(t), changed: !1, reason: "already_transparent" };
|
|
323
|
+
const a = [0, (e - 1) * 4, (n - 1) * e * 4, (e * n - 1) * 4], r = [0, 1, 2].map(
|
|
324
|
+
(c) => Math.round(a.reduce((w, A) => w + t[A + c], 0) / 4)
|
|
325
|
+
);
|
|
326
|
+
a.some((c) => O(t, c, r) > P) && U("PROCESSING_FAILED", "Logo四角背景不一致,上传原版保留", "inconsistent_corners");
|
|
327
|
+
const o = (c) => {
|
|
328
|
+
for (let w = 0; w < e; w++)
|
|
329
|
+
c(w), n > 1 && c((n - 1) * e + w);
|
|
330
|
+
for (let w = 1; w < n - 1; w++)
|
|
331
|
+
c(w * e), e > 1 && c(w * e + e - 1);
|
|
332
|
+
};
|
|
333
|
+
let f = 0, i = 0;
|
|
334
|
+
o((c) => {
|
|
335
|
+
f++, O(t, c * 4, r) <= P && i++;
|
|
336
|
+
}), i / f < 0.9 && U("PROCESSING_FAILED", "Logo边缘背景不够纯色,上传原版保留", "noisy_background");
|
|
337
|
+
let s = !1;
|
|
338
|
+
for (let c = 0; c < t.length; c += 4)
|
|
339
|
+
if (O(t, c, r) > C) {
|
|
340
|
+
s = !0;
|
|
341
|
+
break;
|
|
342
|
+
}
|
|
343
|
+
s || U("PROCESSING_FAILED", "没有可安全区分的Logo前景,上传原版保留", "no_foreground");
|
|
344
|
+
const l = e * n, g = new Uint32Array(l), I = new Uint8Array(l), h = new Uint8ClampedArray(t);
|
|
345
|
+
let m = 0, d = 0;
|
|
346
|
+
const u = (c) => {
|
|
347
|
+
!I[c] && O(t, c * 4, r) <= C && (I[c] = 1, g[d++] = c);
|
|
348
|
+
};
|
|
349
|
+
for (o(u); m < d; ) {
|
|
350
|
+
const c = g[m++], w = c * 4, A = c % e, L = Math.floor(c / e);
|
|
351
|
+
if (O(t, w, r) <= P) h[w + 3] = 0;
|
|
352
|
+
else {
|
|
353
|
+
const _ = it(t, e, n, c, r);
|
|
354
|
+
_ || U(
|
|
355
|
+
"PROCESSING_FAILED",
|
|
356
|
+
"背景纹理无法与Logo软边安全区分,上传原版保留",
|
|
357
|
+
"noisy_background"
|
|
358
|
+
), h.set(_.fg, w), h[w + 3] = _.alpha * 255;
|
|
359
|
+
}
|
|
360
|
+
A > 0 && u(c - 1), A + 1 < e && u(c + 1), L > 0 && u(c - e), L + 1 < n && u(c + e);
|
|
361
|
+
}
|
|
362
|
+
return { data: h, changed: d > 0 };
|
|
363
|
+
}
|
|
364
|
+
const D = 5 * 1024 * 1024, S = 4e6;
|
|
365
|
+
self.onmessage = async (t) => {
|
|
366
|
+
const { id: e, blob: n, normalizeOnly: a, crop: r } = t.data;
|
|
367
|
+
let o;
|
|
368
|
+
try {
|
|
369
|
+
if (!n.size || n.size > D) throw new Error("Logo 超过5MiB");
|
|
370
|
+
et(new Uint8Array(await n.arrayBuffer()));
|
|
371
|
+
const f = await W(n);
|
|
372
|
+
o = await createImageBitmap(f.blob);
|
|
373
|
+
const i = o.width, s = o.height;
|
|
374
|
+
if (i * s > S) throw new Error("Logo 超过400万像素");
|
|
375
|
+
const l = new OffscreenCanvas(i, s), g = l.getContext("2d", { colorSpace: "srgb" });
|
|
376
|
+
if (!g) throw new Error("浏览器不支持本机 Logo 处理");
|
|
377
|
+
g.drawImage(o, 0, 0);
|
|
378
|
+
const I = g.getImageData(0, 0, i, s), h = Z(I.data, i, s, k, f.orientation), m = a ? { data: h.data, changed: !0 } : ft(h.data, h.width, h.height);
|
|
379
|
+
if (r?.kind === "alpha") {
|
|
380
|
+
const w = T(
|
|
381
|
+
B(m.data, h.width, h.height),
|
|
382
|
+
h.width,
|
|
383
|
+
h.height,
|
|
384
|
+
r.padding
|
|
385
|
+
);
|
|
386
|
+
if (w.kind === "render" && w.width * w.height > S)
|
|
387
|
+
throw new Error("Logo 超过400万像素");
|
|
388
|
+
}
|
|
389
|
+
const d = r?.kind === "alpha" ? y(m.data, h.width, h.height, r.padding, "transparent") : void 0;
|
|
390
|
+
if (d?.kind === "skip" && d.reason === "fully-transparent")
|
|
391
|
+
throw Object.assign(new Error("没有可安全区分的Logo前景,上传原版保留"), {
|
|
392
|
+
reason: "no_foreground"
|
|
393
|
+
});
|
|
394
|
+
const u = d?.kind === "image" ? d : { data: m.data, width: h.width, height: h.height };
|
|
395
|
+
if (u.width * u.height > S) throw new Error("Logo 超过400万像素");
|
|
396
|
+
l.width = u.width, l.height = u.height, g.putImageData(
|
|
397
|
+
new ImageData(u.data, u.width, u.height),
|
|
398
|
+
0,
|
|
399
|
+
0
|
|
400
|
+
);
|
|
401
|
+
const c = await l.convertToBlob({ type: "image/png" });
|
|
402
|
+
if ((!a || r?.kind === "alpha") && c.size > D)
|
|
403
|
+
throw new Error("去底后的PNG超过5MiB,请使用更小的Logo");
|
|
404
|
+
self.postMessage({
|
|
405
|
+
id: e,
|
|
406
|
+
blob: c,
|
|
407
|
+
changed: !0,
|
|
408
|
+
width: u.width,
|
|
409
|
+
height: u.height
|
|
410
|
+
});
|
|
411
|
+
} catch (f) {
|
|
412
|
+
self.postMessage({
|
|
413
|
+
id: e,
|
|
414
|
+
error: f instanceof Error ? f.message : "Logo 去底失败,原图保留",
|
|
415
|
+
reason: f instanceof Error && "reason" in f && typeof f.reason == "string" ? f.reason : void 0
|
|
416
|
+
});
|
|
417
|
+
} finally {
|
|
418
|
+
o?.close();
|
|
419
|
+
}
|
|
420
|
+
};
|
|
Binary file
|
|
Binary file
|