← 返回官网

第三方组件与许可证(小雨修图 Windows 本地版)

> 版本:随 1.3.1 整理(2026-10-17)

> 用途:加新依赖前查一下、客户问合规性时直接拿出去。

> 免责:这是工程视角的整理,不是法律意见。要商业分发、签授权合同,请让懂知识产权的律师过一眼。


0. 先看结论(三行)

| 问题 | 答案 |
| --- | --- |
| 本软件主体是什么协议? | **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 面板…)

全部是自己实现的,没有引入任何第三方依赖。


1. 许可证速查(判断规则)

| 许可证 | 能不能进这个软件 | 你要做什么 | 只在分发时生效? |
| --- | --- | --- | --- |
| **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 → 保留声明即可。

关键前提:这些义务都只在"分发"(把软件给出去、包括卖、送、放到网上给人下)时触发;自己在自己电脑上用不管。


2. 随软件分发的组件(要紧的部分)

| 组件 | 版本 / 来源 | 许可证 | 用途 | 我们怎么满足义务 |
| --- | --- | --- | --- | --- |
| **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 应该在。


3. 只在开发/测试时出现的组件(不随软件分发)

3.1 开发依赖(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/ 都不同步到运行时目录)。虽然一般不分发就没有义务,但记录在此备查。

3.2 测试素材

| 素材 | 来源 | 许可证 | 说明 |
| --- | --- | --- | --- |
| `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 码流无法手写);回归只断言像素语义不断言哈希 |

4. 自研部分(没有第三方依赖)

下面这些功能都是本项目自己实现的算法/封装,没有引入依赖,因此不产生额外的许可证义务:

| 模块 | 内容 |
| --- | --- |
| `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`);界面用系统字体(**没有内置第三方字体**);教程/文案自写 |

5. 加新依赖前的检查清单(含这个项目踩过/差点踩的坑)

四步:

  1. 看它 package.json 的 license 字段 / 仓库里的 LICENSE 文件;不确定就查 <https://choosealicense.com>。
  2. 判断属于哪一类:宽松(MIT/ISC/BSD/Apache)→ 直接用;弱传染(LGPL)→ 能用,但保持独立文件/可替换、别改它;强传染(GPL/AGPL)→ 需要你决定"整个软件是否开源"。
  3. 分清它会不会随软件分发:只在开发/构建时用(如打包工具)→ 义务基本不落到你头上(但仍建议记录);会进入安装包 → 按第 1 条的规则处理。
  4. 记进本文件(第 2 或第 3 节)。

已知坑(都和我们这个项目相关):


6. 对外分发时要带上什么(清单)


7. 怎么自查(命令备忘)

```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|使用说明' }

```