> 版本:随 1.3.1 整理(2026-10-17)
> 用途:加新依赖前查一下、客户问合规性时直接拿出去。
> 免责:这是工程视角的整理,不是法律意见。要商业分发、签授权合同,请让懂知识产权的律师过一眼。
| 问题 | 答案 | | --- | --- | | 本软件主体是什么协议? | **MIT**(正文见仓库根目录 `LICENSE`)—— 可闭源、可商用、可再分发,只需保留版权与许可声明 | | **我们自己选用的**组件里有 GPL / AGPL 吗? | **没有**。HEIC 导出用的 HEVC 编码器来自**系统/显卡驱动**(不随软件分发),所以不涉及 GPL | | 随软件分发的第三方代码有哪些? | **只有 5 个是我们引入的**:`libheif-js`(**LGPL-3.0**,用于 HEIC 解码,独立文件放 `app/vendor/libheif/`);`libraw-wasm-nothread` + **LibRaw**(**ISC 封装 + LGPL-2.1/CDDL 本体**,用于相机 RAW 解码,独立文件放 `app/vendor/libraw/`);**UTIF.js + pako**(**均 MIT**,用于 TIFF 解码,独立文件放 `app/vendor/tiff/`);**@jsquash/jxl(libjxl)**(**Apache-2.0**,用于 JPEG XL 解码,独立文件放 `app/vendor/jxl/`);其余是 **Electron 运行时自带的**(Chromium / Node 等,AVIF 解码就是 Chromium 自带能力,无额外组件),它们的许可文本由 Electron 官方打包附带 | | 那分发目录里为什么会看到 GPL 字样? | Electron 运行时的 `LICENSES.chromium.html`(约 20 MB)里**确实包含** Chromium 自带的若干 GPL/LGPL/AGPL 组件与协议全文——这是 **Chromium/Electron 官方的合规材料,随运行时原样分发**,不是我们额外链接进来的代码。我们做的是"原样分发 Electron",**没有在此基础上再塞 GPL 组件**(这正是 HEIC 导出不打包 x265 的原因) |
> 一句话:我们引入的组件里没有 GPL;Electron 运行时自带的第三方清单以 LICENSES.chromium.html 为准(已随包附带)。
自研功能(HDR 合成、全景拼接、HEIF/AVIF 封装、PSD 读写、批量管线、证件照、自动备份、污点修复算法、AI 面板…)
全部是自己实现的,没有引入任何第三方依赖。
| 许可证 | 能不能进这个软件 | 你要做什么 | 只在分发时生效? | | --- | --- | --- | --- | | **MIT / ISC / BSD** | 可以,随便用 | 保留版权声明与许可文本 | 是 | | **Apache-2.0** | 可以 | 保留声明;若你改了它的文件要说明;含专利授权 | 是 | | **LGPL-2.1 / LGPL-3.0** | 可以(弱传染) | ① 保留声明;② 未修改它本身;③ **让用户能替换/重新链接这个库** | 是 | | **GPL-2.0 / GPL-3.0** | ⚠️ 用了就"传染" | **整个软件都要按 GPL 开源**,并允许用户免费再分发 | 是 | | **AGPL-3.0** | ⚠️ 更狠 | 同上,而且**只提供网络服务**(不给安装包)也算分发 | 是(含网络服务) | | 无许可证 / 自定义 | ❌ 别用 | 默认"保留所有权利",用了有风险 | — |
一句话记法:名字里带 GPL → 要么不碰、要么买商业授权、要么整个软件开源;LGPL → 能用,但别改它并且要让用户能替换;MIT/Apache/BSD/ISC → 保留声明即可。
关键前提:这些义务都只在"分发"(把软件给出去、包括卖、送、放到网上给人下)时触发;自己在自己电脑上用不管。
| 组件 | 版本 / 来源 | 许可证 | 用途 | 我们怎么满足义务 | | --- | --- | --- | --- | --- | | **Electron** | 44.7.0(`node_modules/electron`,打包时进入分发目录) | **MIT** | 桌面运行环境(窗口、IPC、原生对话框、系统剪贴板等) | 分发目录里已带 Electron 的 `LICENSE`(Electron 官方打包自带) | | **Chromium**(Electron 内置内核) | Chromium 152(随 Electron) | **BSD-3-Clause** 为主,另有 icu/zlib/brotli/… 多种宽松协议 | 渲染引擎、WebCodecs(我们用它做 AV1/HEVC 编码)、Canvas | 分发目录里已带 `LICENSES.chromium.html`(约 20 MB,Electron 官方打包自带) | | **Node.js**(Electron 内置) | 随 Electron | **MIT** | 主进程运行环境 | 同上(在 `LICENSES.chromium.html` 与 `LICENSE` 覆盖范围内) | | **FFmpeg 动态库**(`ffmpeg.dll`) | Chromium 的构建(随 Electron) | **LGPL-2.1+ / BSD** | 音视频基础能力(本软件不直接调用) | 同上。注意:**Chromium 的 ffmpeg 构建不含 (L)GPL 编码器(x264/x265)**,所以没有 GPL 传染问题 | | **SwiftShader / Vulkan loader**(`vk_swiftshader.dll` / `vulkan-1.dll`) | 随 Electron | **Apache-2.0 / MIT** 类 | 无 GPU 时的软件渲染兜底 | 同上(Electron 打包自带许可文本) | | **libheif-js** | 1.23.5(`app/vendor/libheif/libheif-bundle.js`,2.0 MB,wasm 内联) | **LGPL-3.0**(libheif 与 libheif-js 均为此协议) | **HEIC/HEIF 解码**(Chromium 本身不解 HEIC) | ① 以**独立文件**分发、**未修改**源码;② 通过 `<script>` **动态加载**,用户可替换成自己编译的版本(满足 LGPL 的"可替换"要求);③ 声明与来源写在 `app/vendor/libheif/README.md`,并在「关于」面板里说明;④ 「关于」面板有一键打开 LGPL 全文的按钮 | | **Windows 的 HEVC 编码器**(`HEVC 视频扩展` / 显卡驱动) | 操作系统/驱动提供 | 不适用(**不是我们分发的代码**) | HEIC 导出时的 HEVC 编码(WebCodecs 调用) | 无需处理:我们只是**调用系统能力**,没有把编码器打进安装包(这也是刻意规避 x265 的 GPL 的做法,见第 5 节) | | **LibRaw(WASM 构建)** | 0.22.x 系(`app/vendor/libraw/libraw.js` 约 62KB + `libraw.wasm` 约 1.35MB;JS 封装取自 npm 包 `libraw-wasm-nothread` v1.6.0-nothread.1,LibRaw 本体随该包编译) | **LGPL-2.1 / CDDL 双协议**(LibRaw 本体);JS 封装 **ISC** | **相机 RAW 解码**(.cr2/.cr3/.nef/.arw/.raf/.orf/.rw2/.pef/.srw/.dng/.gpr 等,Chromium 本身不解 RAW) | ① 以**独立文件**分发、**未修改**源码;② 由独立子进程 `raw-worker.js` 运行时**动态加载**,用户可替换成自己编译的版本(满足 LGPL 的"可替换"要求);③ 声明与来源写在 `app/vendor/libraw/README.md`,主页 `index.html` 的 CSP 因此未放开 eval(子进程里没有 CSP 限制);④ 建议在「关于」面板补一句"包含 LGPL 授权的 LibRaw(相机 RAW 解码)" | | **UTIF.js** | 3.1.0(`app/vendor/tiff/UTIF.js` 约 57KB,**原样取自 npm 发行包**) | **MIT** | **TIFF 解码**(.tif/.tiff,未压缩/PackBits/LZW/Deflate/JPEG 压缩的基线文件;Chromium 本身不解 TIFF) | MIT:随包保留版权与许可声明即可(见 `app/vendor/tiff/README.md`);以独立文件 + `<script>` 动态加载,删掉即完全移除 | | **pako** | 1.0.11(`app/vendor/tiff/pako.min.js` 约 45KB,**原样取自 npm 发行包**) | **MIT** | zlib 的 JS 移植,给 UTIF 解 **Deflate 压缩的 TIFF** 用 | 同上(MIT,见 `app/vendor/tiff/README.md`) | | **@jsquash/jxl(libjxl)** | 1.3.0(`app/vendor/jxl/jxl-dec-mod.js` 约 35KB + `jxl_dec.wasm` 约 829KB;wasm 原样,胶水只做了「ESM→全局脚本」三处机械改动) | **Apache-2.0** | **JPEG XL 解码**(.jxl;Chromium 内核不解 JXL) | Apache-2.0 宽松:随包保留版权与许可声明(`app/vendor/jxl/LICENSE`);**未修改解码逻辑**(改动只在加载方式,已在 `app/vendor/jxl/README.md` 逐条列明),删掉该目录即完全移除 |
> 关于 LICENSES.chromium.html 里的 GPL / AGPL 字样:Electron 运行时自带的那份清单里确实包含 Chromium 自己用到的若干 GPL/LGPL/AGPL 组件与协议全文(约 20 MB)。那是 Chromium/Electron 官方的合规材料,随运行时原样分发;我们没有在此基础上再链接任何 GPL 代码。检查时别把它误当成"你引入了 GPL"。
> 分发前自查一遍:D:\小雨修图\ 里应当能看到 LICENSE(Electron 的)与 LICENSES.chromium.html;
> D:\小雨修图\resources\app\app\vendor\libheif\README.md 应该在;
> D:\小雨修图\resources\app\app\vendor\libraw\README.md 应该在;
> D:\小雨修图\resources\app\app\vendor\jxl\README.md 与 app\vendor\jxl\LICENSE 应该在。
devDependencies 及其传递依赖)| 包 | 许可证 | 说明 | | --- | --- | --- | | electron | MIT | 开发/运行 Electron(运行时二进制随软件分发,见第 2 节) | | rcedit | MIT | 打包时写 exe 的图标/版本信息 | | cross-spawn / cross-spawn-windows-exe | MIT / Apache-2.0 | electron 的传递依赖 | | debug / ms / env-paths / progress / is-docker / is-wsl / path-key | MIT | 同上 | | graceful-fs / isexe / semver / which | ISC | 同上 | | shebang-command / shebang-regex / undici / undici-types | MIT | 同上 | | sumchecker | Apache-2.0 | 同上 |
> 这些只在开发机上存在(node_modules/、tests/ 都不同步到运行时目录)。虽然一般不分发就没有义务,但记录在此备查。
| 素材 | 来源 | 许可证 | 说明 | | --- | --- | --- | --- | | `tests/fixtures/heic/sample-rgb-128x128.heic`、`sample-rgba-128x128.heic` | **libheif 官方测试图集**(经 PyPI `pillow-heif` 源码包分发) | 随 libheif(**LGPL-3.0**) | 仅用于本项目的自动化测试(解码 + 封装闭环验证);`tests/` **不会**同步到运行时目录,**不参与分发** | | `tests/fixtures/raw/color-32x24.dng`、`tests/fixtures/tiff/color-24x16.tif` | **本项目手写**(基线 TIFF/DNG 是纯 IFD 结构,确定性字节即可构造合法文件) | 无(自产) | 像素内容完全可断言;硬规则见各自 README | | `tests/fixtures/avif/sample-64x48.avif` | **本项目用 `@jsquash/avif` 本地编码**(Squoosh 的 AVIF 编码 wasm,**Apache-2.0**,仅在开发机离线生成夹具用,**不随软件分发**) | Apache-2.0 | 64×48 确定性渐变(AV1 码流无法手写);回归只断言像素语义不断言哈希 |
下面这些功能都是本项目自己实现的算法/封装,没有引入依赖,因此不产生额外的许可证义务:
| 模块 | 内容 | | --- | --- | | `app/js/hdr.js` | HDR 包围曝光合成(曝光融合 + MTB 自动对齐) | | `app/js/panorama.js` | 全景拼接(FAST 角点、旋转不变描述子、比值检验 + 互相最优匹配、RANSAC 单应 + Hartley 归一化、圆柱/球面/直线三种投影、羽化加权融合、曝光补偿) | | `app/js/heif.js` | HEIC / AVIF **封装器与解析器**(自写 ISOBMFF/HEIF 盒子结构、av1C 构造)+ WebCodecs 编码调度 | | `app/js/heic.js` | HEIC 解码调度 + HEIF 容器内 Exif 解析 | | `app/js/psd.js` | PSD 多图层读写(RLE/ZIP/RAW、图层组、蒙版、16 位导入) | | `app/js/pipeline.js` | 批量处理管线(并发/重试/命名模板/子目录) | | `app/js/idphoto.js` | 证件照模板 + 6 寸/A4 拼版 | | `app/js/autosave.js` | 自动备份与崩溃恢复 | | `app/js/tools.js` | 污点修复的块匹配填充(PatchMatch 精简版)+ 调和抛光(SOR 解拉普拉斯) | | 图标 / UI / 文字 | 图标由本项目脚本自绘(`tests/bughunt/shoot-icons.js`);界面用系统字体(**没有内置第三方字体**);教程/文案自写 |
四步:
package.json 的 license 字段 / 仓库里的 LICENSE 文件;不确定就查 <https://choosealicense.com>。已知坑(都和我们这个项目相关):
ffmpeg.dll 之所以没问题,是因为它的构建不含这些编码器。<script> 加载,满足这一条。node_modules 整个)打进安装包,它们就算分发了。LICENSE(本软件 MIT 正文,仓库根目录)LICENSE + LICENSES.chromium.html(Electron 官方打包自带,位于分发目录)app/vendor/libheif/README.md(LGPL-3.0 来源与声明)+ 「关于」面板中的第三方组件说明使用说明.md 里的"开源许可与第三方组件"章节(面向最终用户)```powershell
Get-ChildItem node_modules -Directory | ForEach-Object {
$pj = Join-Path $_.FullName 'package.json'
if (Test-Path $pj) { "$($_.Name) → " + ((Get-Content $pj -Raw | ConvertFrom-Json).license) }
}
Get-ChildItem 'D:\小雨修图' -File | Where-Object { $_.Name -match 'LICENSE|使用说明' }
```