@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.
Files changed (241) hide show
  1. package/FONT-LICENSE.txt +93 -0
  2. package/README.md +181 -2
  3. package/dist/assets/11st-D7qGO5e4.webp +0 -0
  4. package/dist/assets/UPNG-CPfdwFSy.js +2298 -0
  5. package/dist/assets/adjust-card-B63b81iV.webp +0 -0
  6. package/dist/assets/adjust-final.worker-C2JbTvv5.js +6945 -0
  7. package/dist/assets/amazon-CjTtpZTq.webp +0 -0
  8. package/dist/assets/ascii_art-B4UGbtGs.webp +0 -0
  9. package/dist/assets/auction-j26eVUQO.webp +0 -0
  10. package/dist/assets/background-DGdZUdkL.webp +0 -0
  11. package/dist/assets/background-card-wK7DRpvM.png +0 -0
  12. package/dist/assets/body-CUFdRg8w.webp +0 -0
  13. package/dist/assets/bounded-cutout.worker-BZR6mbaI.js +9615 -0
  14. package/dist/assets/brand-mark-card-cFUeDeO2.webp +0 -0
  15. package/dist/assets/buyma-dAxYNjow.webp +0 -0
  16. package/dist/assets/codec.worker-7W6hmsm6.js +7349 -0
  17. package/dist/assets/contour_lines-C_CqrgV1.webp +0 -0
  18. package/dist/assets/creema-B1tWyCPx.webp +0 -0
  19. package/dist/assets/crop-final.worker-Owin7TvX.js +7035 -0
  20. package/dist/assets/cutout-CzMvV5An.webp +0 -0
  21. package/dist/assets/cutout-card-CN4gNFBz.png +0 -0
  22. package/dist/assets/cutout.worker-DyH6Prbn.js +3894 -0
  23. package/dist/assets/depop-CkVC5Fn1.webp +0 -0
  24. package/dist/assets/dewrinkle-kFzP6LqD.webp +0 -0
  25. package/dist/assets/dither-CcxmO2e6.webp +0 -0
  26. package/dist/assets/douyin-CP_HwBDF.webp +0 -0
  27. package/dist/assets/download.worker-DnGSB6P_.js +17779 -0
  28. package/dist/assets/duotone-Cdg_3fQf.webp +0 -0
  29. package/dist/assets/ebay-CxLfrRAf.webp +0 -0
  30. package/dist/assets/edit-Cv-txfZm.webp +0 -0
  31. package/dist/assets/effect.worker-qu1eCcII.js +9227 -0
  32. package/dist/assets/engraving-BENh1O2O.webp +0 -0
  33. package/dist/assets/etsy-CSvz9GpY.webp +0 -0
  34. package/dist/assets/expand-C60VE9nK.webp +0 -0
  35. package/dist/assets/facebook-Ca2nJJiQ.webp +0 -0
  36. package/dist/assets/film_stock-Bqauwcq4.webp +0 -0
  37. package/dist/assets/final.worker-BnzJ3N5C.js +7035 -0
  38. package/dist/assets/final.worker-Csc1zoYS.js +7054 -0
  39. package/dist/assets/final.worker-DzBFT9xk.js +6922 -0
  40. package/dist/assets/final.worker-XpgKnlaz.js +7217 -0
  41. package/dist/assets/flatlay-CPiVmlAa.webp +0 -0
  42. package/dist/assets/flatlay-fold-B-CRYy87.webp +0 -0
  43. package/dist/assets/flatlay-open-Dzas8okC.webp +0 -0
  44. package/dist/assets/g-market-DXuYK_JH.webp +0 -0
  45. package/dist/assets/ghost-BCEAx_Zx.webp +0 -0
  46. package/dist/assets/ghost-front-WFgA4sUo.webp +0 -0
  47. package/dist/assets/ghost-three-quarter-Rt8cXj34.webp +0 -0
  48. package/dist/assets/gif-CObOIITx.js +303 -0
  49. package/dist/assets/glass_tiles-3IXP-Hmg.webp +0 -0
  50. package/dist/assets/glitch_art-D1i3qben.webp +0 -0
  51. package/dist/assets/glitch_blur-C4q_9zyq.webp +0 -0
  52. package/dist/assets/glow-Bv9EHBU5.webp +0 -0
  53. package/dist/assets/gradient_map-BR-UVYMP.webp +0 -0
  54. package/dist/assets/halftone-CWdKu2_6.webp +0 -0
  55. package/dist/assets/holo_sticker-BQDikLg2.webp +0 -0
  56. package/dist/assets/idus-7diqRNPs.webp +0 -0
  57. package/dist/assets/imagetracer.worker-CgunQTPG.js +7096 -0
  58. package/dist/assets/instagram-Bf0IVidT.webp +0 -0
  59. package/dist/assets/kakao-talk-Df79L_Mv.webp +0 -0
  60. package/dist/assets/kaleidoscope-BxqMZuWo.webp +0 -0
  61. package/dist/assets/karrot-BXFPhDwt.webp +0 -0
  62. package/dist/assets/kaufland-BDDy6e0C.webp +0 -0
  63. package/dist/assets/lazada-ConR4e1O.webp +0 -0
  64. package/dist/assets/lens_flare-DgyiAv_j.webp +0 -0
  65. package/dist/assets/light_leak-kUdpoFuC.webp +0 -0
  66. package/dist/assets/line-Dr1j___B.webp +0 -0
  67. package/dist/assets/linkedin-4s_9Wh03.webp +0 -0
  68. package/dist/assets/lo_fi-DSdl3yY_.webp +0 -0
  69. package/dist/assets/logo-preparation.worker-D9oa7SME.js +420 -0
  70. package/dist/assets/mercado-libre-C8CskEiS.webp +0 -0
  71. package/dist/assets/mercari-jp-DHj7nz4O.webp +0 -0
  72. package/dist/assets/metadata.worker-B_9_BgN1.js +6456 -0
  73. package/dist/assets/mirror_collage-JtSKCeSh.webp +0 -0
  74. package/dist/assets/model-BbeF-fsf.webp +0 -0
  75. package/dist/assets/model-BjWhieit.webp +0 -0
  76. package/dist/assets/momo-BWXO_8Df.webp +0 -0
  77. package/dist/assets/motion_blur-B8YUHeSg.webp +0 -0
  78. package/dist/assets/naver-xQKL8lWg.webp +0 -0
  79. package/dist/assets/nuvemshop-DPt6rnA-.webp +0 -0
  80. package/dist/assets/olx-B87gp-Il.webp +0 -0
  81. package/dist/assets/orient-card-Da0ii6mX.webp +0 -0
  82. package/dist/assets/orient-final.worker-CdF5Y5zD.js +6909 -0
  83. package/dist/assets/orientation-preview.worker-B7uFzz3J.js +6865 -0
  84. package/dist/assets/ort.bundle.min-CreFV8V1.js +9311 -0
  85. package/dist/assets/ort.webgpu.bundle.min-CAudaHZO.js +9311 -0
  86. package/dist/assets/otto-market-DWZyNKJn.webp +0 -0
  87. package/dist/assets/paper_texture-CXphyIrs.webp +0 -0
  88. package/dist/assets/pinterest-ByZqih2J.webp +0 -0
  89. package/dist/assets/polish-DFy6LNG7.webp +0 -0
  90. package/dist/assets/poshmark-DnZi2vA1.webp +0 -0
  91. package/dist/assets/posterize-SpLVGq1s.webp +0 -0
  92. package/dist/assets/preview.worker-DcrCKKWl.js +380 -0
  93. package/dist/assets/qoo10-C1pq81Jx.webp +0 -0
  94. package/dist/assets/rakuten-ulYog1hL.webp +0 -0
  95. package/dist/assets/recolor-mBX7vdFT.webp +0 -0
  96. package/dist/assets/resize-DVEAl0Um.webp +0 -0
  97. package/dist/assets/runtime-0663b902fb3937883a34.wasm +0 -0
  98. package/dist/assets/runtime-355a5c80c7bfdf8737de.mjs +2817 -0
  99. package/dist/assets/runtime-49871f5a4409519797e1.wasm +0 -0
  100. package/dist/assets/runtime-74cf72f9a2b7befc115a.mjs +2817 -0
  101. package/dist/assets/shadow-card-DTZEH60r.png +0 -0
  102. package/dist/assets/shopee-Bxfei6sj.webp +0 -0
  103. package/dist/assets/shopify-wVaBafcF.webp +0 -0
  104. package/dist/assets/shopline-DMoaJ7Bh.webp +0 -0
  105. package/dist/assets/sparkle-CD5GSGip.webp +0 -0
  106. package/dist/assets/ssg-DQoFx5u5.webp +0 -0
  107. package/dist/assets/staging-CIc8pQJ6.webp +0 -0
  108. package/dist/assets/standard-cutout.worker-BYLzdpR-.js +1261 -0
  109. package/dist/assets/text-DQW2mBGp.webp +0 -0
  110. package/dist/assets/textured_glass-D2coxp7n.webp +0 -0
  111. package/dist/assets/tga-VGxWDes0.js +752 -0
  112. package/dist/assets/tilt_shift-BKs46yeX.webp +0 -0
  113. package/dist/assets/transformers.web-DB57cIO5.js +28891 -0
  114. package/dist/assets/tritone-CcR4qizk.webp +0 -0
  115. package/dist/assets/upscale-BrLadyUk.webp +0 -0
  116. package/dist/assets/upscale-creative-DnZnQufJ.webp +0 -0
  117. package/dist/assets/upscale-crisp-Ckdmbsnn.webp +0 -0
  118. package/dist/assets/vinted-1QDsxvC6.webp +0 -0
  119. package/dist/assets/watercolor-CV67zYNE.webp +0 -0
  120. package/dist/assets/watermark-CpPrxaT5.webp +0 -0
  121. package/dist/assets/wave_distortion-CV5jVfK4.webp +0 -0
  122. package/dist/assets/whatsapp-CWJxqzR6.webp +0 -0
  123. package/dist/assets/worker-DfrCFP3O.js +55 -0
  124. package/dist/assets/xerox_noise-CbbHY1S1.webp +0 -0
  125. package/dist/assets/youtube-DS12d5mi.webp +0 -0
  126. package/dist/assets/zalando-CenfWOwz.webp +0 -0
  127. package/dist/browser-adapter.d.ts +4 -0
  128. package/dist/browser-cutout-capability.d.ts +4 -0
  129. package/dist/browser-cutout-resources.d.ts +3 -0
  130. package/dist/browser-local-capabilities.d.ts +5 -0
  131. package/dist/capabilities.d.ts +18 -0
  132. package/dist/chunks/AdjustToolPanel-B6dtlFlj.js +195 -0
  133. package/dist/chunks/BackgroundToolPanel-C3Rr9d4S.js +41 -0
  134. package/dist/chunks/BatchMaterials-DDoJTaS5.js +806 -0
  135. package/dist/chunks/BatchModeChoices-DeBARgvY.js +111 -0
  136. package/dist/chunks/BatchOutputColorPicker-D7WIDS4_.js +75 -0
  137. package/dist/chunks/BatchReferenceFields-Cr5WgFRJ.js +316 -0
  138. package/dist/chunks/BeautifyToolPanel-DDZXDQKM.js +215 -0
  139. package/dist/chunks/BrandMarkToolPanel-vKobk_R3.js +1179 -0
  140. package/dist/chunks/ContentTrimControl-BKCJEst5.js +297 -0
  141. package/dist/chunks/CropToolPanel-C_sW5tWL.js +218 -0
  142. package/dist/chunks/CutoutToolPanel-B7ObmiWd.js +73 -0
  143. package/dist/chunks/DisclosureToolPanel-F3ccFJIF.js +76 -0
  144. package/dist/chunks/ExpandToolPanel-BKjj5UJA.js +67 -0
  145. package/dist/chunks/ImageEffectsToolPanel-CsDIBpT6.js +966 -0
  146. package/dist/chunks/IpAuditToolPanel-CduDfFh-.js +96 -0
  147. package/dist/chunks/ListingToolPanel-8pJ2_zvI.js +783 -0
  148. package/dist/chunks/MaterialSelectionPlate-CW7HaS6v.js +30 -0
  149. package/dist/chunks/MetadataToolPanel-C8XJOamN.js +104 -0
  150. package/dist/chunks/OrientToolPanel-C1AzQchm.js +161 -0
  151. package/dist/chunks/PluginActionFooter.vue_vue_type_script_setup_true_lang-BGe419qz.js +102 -0
  152. package/dist/chunks/ResizeToolPanel-DWikcj2G.js +1178 -0
  153. package/dist/chunks/RetouchToolPanel-B4eQKk2W.js +350 -0
  154. package/dist/chunks/ShadowToolPanel-Bbj76hQd.js +254 -0
  155. package/dist/chunks/SvgExportToolPanel-BRxpzd7q.js +219 -0
  156. package/dist/chunks/TranslationToolPanel-Bxv8U2WY.js +125 -0
  157. package/dist/chunks/UpscaleToolPanel-BRIgpszs.js +127 -0
  158. package/dist/chunks/engine-D-T-1RSx.js +69 -0
  159. package/dist/chunks/entry-CboOSe2r.js +42945 -0
  160. package/dist/chunks/gpu-CScw5MNG.js +231 -0
  161. package/dist/chunks/hosted-resources-COzZ7nZY.js +8196 -0
  162. package/dist/chunks/loader-circle-CylCgDqP.js +16 -0
  163. package/dist/chunks/motionFeatures-D67ghPG1.js +4405 -0
  164. package/dist/chunks/search-BwsDnulU.js +18 -0
  165. package/dist/chunks/standard-cutout-vPpP6xBc.js +45 -0
  166. package/dist/chunks/static-logo-2F9ORZWc.js +34 -0
  167. package/dist/config.d.ts +66 -0
  168. package/dist/contracts.d.ts +272 -0
  169. package/dist/index.d.ts +23 -0
  170. package/dist/index.js +13 -0
  171. package/dist/node/catalog.mjs +45 -0
  172. package/dist/node/cli.mjs +11 -0
  173. package/dist/node/index.d.mts +20 -0
  174. package/dist/node/index.mjs +2 -0
  175. package/dist/node/prepare.mjs +114 -0
  176. package/dist/node/vite.mjs +46 -0
  177. package/dist/processing.d.ts +1 -0
  178. package/dist/processing.js +12105 -0
  179. package/dist/remote-contracts.d.ts +114 -0
  180. package/dist/resource-contracts.d.ts +40 -0
  181. package/dist/resources/cutout/9ae2e5375a34fa413530954dc20d085d175faffc86108c13619220d0557f80bf.json +1 -0
  182. package/dist/resources/cutout/f119dabecc64bc436d3d08425dde96ec2598fd40541eba97d8d53a4e8bbdcaea.json +1 -0
  183. package/dist/resources/cutout/resources.json +195 -0
  184. package/dist/resources/cutout/sources.json +294 -0
  185. package/dist/resources.json +1191 -0
  186. package/dist/service-contracts.d.ts +43 -0
  187. package/dist/slots.d.ts +21 -0
  188. package/dist/style.css +1 -0
  189. package/dist/types/batch/api.d.ts +89 -0
  190. package/dist/types/batch/cutout-output.d.ts +2 -0
  191. package/dist/types/batch/features/background/engine.d.mts +12 -0
  192. package/dist/types/batch/features/basic-edit/contracts.d.ts +87 -0
  193. package/dist/types/batch/features/basic-edit/engine.d.mts +96 -0
  194. package/dist/types/batch/features/brand-mark/contracts.d.ts +84 -0
  195. package/dist/types/batch/features/brand-mark/engine.d.mts +68 -0
  196. package/dist/types/batch/features/export-compression/contracts.d.ts +44 -0
  197. package/dist/types/batch/features/export-compression/gifenc.d.ts +33 -0
  198. package/dist/types/batch/features/export-compression/plan.d.ts +45 -0
  199. package/dist/types/batch/features/export-compression/presentation.d.ts +70 -0
  200. package/dist/types/batch/features/export-compression/upng.d.ts +6 -0
  201. package/dist/types/batch/features/final-image/resize.d.mts +15 -0
  202. package/dist/types/batch/features/image-effects/contracts.d.ts +58 -0
  203. package/dist/types/batch/features/image-effects/gpu-pixel-runtime.d.ts +15 -0
  204. package/dist/types/batch/features/image-effects/photo-audit.d.ts +21 -0
  205. package/dist/types/batch/features/image-effects/photo-v7-cpu.d.ts +9 -0
  206. package/dist/types/batch/features/image-effects/profiles-v4.d.ts +157 -0
  207. package/dist/types/batch/features/image-effects/profiles-v5.d.ts +20 -0
  208. package/dist/types/batch/features/image-effects/profiles-v6.d.ts +14 -0
  209. package/dist/types/batch/features/image-effects/profiles-v7.d.ts +53 -0
  210. package/dist/types/batch/features/image-effects/profiles-v8.d.ts +113 -0
  211. package/dist/types/batch/features/image-effects/profiles-v9.d.ts +20 -0
  212. package/dist/types/batch/features/image-translation/params.d.ts +257 -0
  213. package/dist/types/batch/features/listing-remake/transport.d.ts +21 -0
  214. package/dist/types/batch/features/metadata/bytes.d.mts +13 -0
  215. package/dist/types/batch/features/metadata/containers.d.mts +20 -0
  216. package/dist/types/batch/features/metadata/declaration.d.mts +5 -0
  217. package/dist/types/batch/features/metadata/engine.d.mts +9 -0
  218. package/dist/types/batch/features/metadata/exchange.d.mts +48 -0
  219. package/dist/types/batch/features/shadow/contracts.d.ts +43 -0
  220. package/dist/types/batch/features/shadow/engine.d.mts +33 -0
  221. package/dist/types/batch/features/svg-export/download-contract.d.ts +33 -0
  222. package/dist/types/batch/features/svg-export/download-prepare.d.ts +2 -0
  223. package/dist/types/batch/features/svg-export/download.d.ts +7 -0
  224. package/dist/types/batch/features/svg-export/imagetracer.d.ts +6 -0
  225. package/dist/types/batch/features/svg-export/optimizer.d.ts +2 -0
  226. package/dist/types/batch/ids.d.ts +1 -0
  227. package/dist/types/batch/model.d.ts +317 -0
  228. package/dist/types/batch/public/config.d.ts +66 -0
  229. package/dist/types/batch/public/contracts.d.ts +272 -0
  230. package/dist/types/batch/public/remote-contracts.d.ts +114 -0
  231. package/dist/types/batch/public/resource-contracts.d.ts +40 -0
  232. package/dist/types/batch/public/service-contracts.d.ts +43 -0
  233. package/dist/types/batch/queue.d.ts +34 -0
  234. package/dist/types/batch/receipts.d.ts +85 -0
  235. package/dist/types/batch/retention.d.ts +13 -0
  236. package/dist/types/onnxruntime-web.d.ts +5 -0
  237. package/dist/types/plugins/cutout/core/hosted-resources.d.ts +11 -0
  238. package/dist/types/processing.d.ts +18 -0
  239. package/dist/types/shared/svg-security.d.mts +4 -0
  240. package/dist/types/workspace-worker.d.ts +2 -0
  241. package/package.json +91 -3
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
+ };