创建 6 天 4638 星:Compositor 如何用 Swift、C 和 Metal 重做 Mac 上的图像编辑器
【免费下载链接】CompositorThe Photoshop alternative for Mac项目地址: https://gitcode.com/gh_mirrors/compos/Compositor
2026 年 9 月中旬,一个名为 Compositor 的 macOS 原生开源图像编辑器登上 GitHub 趋势榜,创建仅 6 天就拿到 4638 星。项目 README 的自述只有一句:"The Photoshop alternative for Mac"。它凭什么?我把仓库翻完,试图回答一个问题:一个 Swift 写的单人项目,凭什么敢接"像素级对标 PS"这句话。
工程透视:Swift 做壳、C 做像素、Metal 做合成
Compositor 的架构是一条刻意的三层分工:UI 层全部是 SwiftUI + AppKit,逐像素循环全部下沉到 C 内核,合成渲染交给 Metal。这不是新技术组合,而是老式系统软件的思路——用最慢的语言包最复杂的交互,用最快的语言啃最重的循环。可量化的证据都在文件头注释里:
- GPUCanvas.swift 的开篇注释给了一个基准数字:Core Graphics 在 CPU 上逐层合成,Retina 屏上一张全尺寸图层每帧约 5 毫秒,拖拽、平移、缩放时每帧都在重复;GPUCanvasRenderer 让图层以纹理形式留在 GPU 上,一帧只做一次重新摆放。
- 同一文件里
keepFrames = 90:空闲 90 帧未命中的纹理从缓存池中释放,系统内存告急时优先丢非当前帧资源,是一套显存压力自适应策略。 - TiledLayerRenderer.swift 里
committedCell = 1024、strokeCell = 256:已提交的图层快照用 1024 像素大格增量重建,进行中的笔划用 256 像素小格,鼠标每动一下只重建被触碰的方块。 - DocumentLimits.swift 把上限做成"随内存缩放":画布最长边 30000 像素,整份文档的像素预算取物理内存除以 16(即内存的 1/4 按 RGBA 折算,注释里算好了 8 GB 内存约 537 MP),下限 2 亿像素、上限 8 亿像素封顶。
C 内核一侧,HealPixels.c 用heal_score对候选补丁逐块算均方误差、拒绝一切越界或重叠的取样;WandPixels.c 的魔棒在种子点取邻域平均色作参考、按容差扩散,并为描边路径设了wand_edge_limit = 8000000的边界上限,防止超大选区把路径绘制拖垮。
出圈复盘:为什么是现在、为什么是它
传播轨迹几乎可以按天串:9 月 20 日 Compositor 登上 GitHub 日榜,与一批 AI 代理项目并列进入当日趋势速报;9 月 22 日已有文章逐模块剖析它的图层系统与 Metal/C 混合渲染管线;9 月 26 日主流技术社区定调"100% 开源免费对标 Photoshop";创建第 6 天 Star 数定格在 4638。社区反馈集中在三点。
MIT 协议,商用零授权费。LICENSE 是标准 MIT,版权归 Wonder Assembly LLC。个人创作者能拿去商用出图,开发者能把它改造成自己的产品,公司能嵌进自己的管线,全部不付一分钱。
Photoshop 肌肉记忆被完整搬来。README 里作者坦言动机:Photoshop 太贵,GIMP 不够顺手,他没法保持心流。于是 Compositor 按 Photoshop 顺序排满全部混合模式,文件夹不透明度会压暗内部所有层,⌘E合并、⌘C/⌘V跨工程复制图层、数字标签可拖拽 scrubbing——迁移成本被压到接近零。
它真的能打开你的 PSD。开源修图工具的常见槽点是复杂 PSD 打不开。Compositor 对 8-bit RGB 的 PSD/PSB,保留文件夹、蒙版、混合模式、填充矩形/椭圆与简单横排文本为可编辑对象,其余矢量栅格化,且每一步都先出示转换报告再执行。
硬核细节:三个经得起源码推敲的设计
非破坏性编辑不是口号,而是文件格式层的约束
判断:Compositor 的非破坏性写进了工程格式规范,而不是靠 UI 层小心维护。证据在 docs/project-format.md:.comp格式从 v1 演进到 v20,其中 v7 引入调整图层(色阶、曲线、色相/饱和度、曝光、渐变映射、颗粒、黑白、色彩平衡、反相),v9 加邻域采样类调整(高斯模糊 0.1–250 像素、动感模糊、噪点),每个 kind 的参数范围、越界拒绝规则、新旧版本兼容矩阵都逐条写明。对用户的意义是:图层无论缩得多小,原始分辨率都留在工程里;图层效果(描边、投影、内外阴影、内外发光)由 GPU 实时渲染,参数随时可改,因为它们是 manifest 里的元数据而非烘焙进像素的结果。
.comp是文件夹:给 AI 代理留了一扇原生门
判断:Compositor 最超前的一步,是把工程文件做成了"任何能写文件的进程都能编辑的格式"。[docs/writing-comp-files.md](https://link.gitcode.com/i/46b6c671fdd6eb2f0ced2076d6e141fe)直接面向 AI 代理:一个.comp就是manifest.json+ 一堆<layer UUID>.png,规则是"先写 PNG、再原子替换 manifest",代理每写一次,打开中的画布在约半秒内热重载,无插件、无 API。这意味着 AI 绘图工具产出的是一份可继续编辑的分层工程——代理"一步一层"地渐进创作,你拿到的是普通图层:改不透明度、换混合模式、给蒙版补两笔、保存。传统图像编辑器从未提供过这种把创作过程直接暴露给外部脚本的原生接口。
文档上限随你的内存缩放,上限还留了拒绝逻辑
判断:大多数编辑器写死一个画布上限,Compositor 把上限做成了物理参数。回到 DocumentLimits.swift:documentPixelBudget = min(800_000_000, max(maxSurfacePixels, physicalMemory / 16)),16 GB 的 Mac 直接顶到 8 亿像素上限(约 3.2 GB 图层像素)。同文件还区分了"单个表面"和"整份文档"两套预算——注释里专门论证了一张 5800 万像素、29 个图层的横幅是"普通 Photoshop 文档",单一表面预算装不下它。对用户而言,你的 Mac 有多大内存,它就敢开多大的文档;而 docs/project-format.md 里 10000 图层、4 MiB manifest、512 MiB 单资产的校验规则,保证了再大的文档也不会把导入拖垮。
走向预判:三个可验证的关口
兼容性边界。PSD 目前仅支持 8-bit RGB,不支持 CMYK,文本图层与智能对象被栅格化。要在"PS 替代品"的叙事里走远,CMYK 工作流与更完整的矢量保留是绕不开的硬仗,社区对复杂 PSD 的每一次打开失败都会记在这笔账上。
平台边界。项目明确要求 macOS 26.0+ 与 Apple silicon,且 README 明确拒绝本地化 PR——单人维护下每个新字符串都要永久跟着翻译,这是刻意的边界。值得注意的是 README 里已列出不官方移植版(Windows 两个、Linux 一个),说明跨平台需求真实存在,而作者选择不背书,这条线会一直绷紧。
单人维护的可持续性。仓库代码风格高度统一、注释密度异常、CI 全量跑测试,工程素养极高;但 README 也坦诚 maintained by one person。功能请求与 PSD 兼容诉求涌来时,是引入协作者还是守住"一人一剑",将决定它是下一个 GIMP 还是昙花一现。
回到开头的问题:一个 Swift 写的单人项目凭什么对标 PS?答案是它把 Photoshop 的工作流、非破坏性编辑、面向 AI 代理的文件格式和 macOS 原生能力拧成了同一件事,并且用 C + Metal 把重活跑得飞快。它证明了"免费开源的图像编辑器"这道题,除了 C++ 巨型单体,还存在 Swift + C + Metal + Vision 的原生解法。想研究图像编辑器架构的人,Compositor/Document 下六十多个模块就是一本活教材;想摆脱订阅费的 Mac 创作者,它已经值得你下载一试。
【免费下载链接】CompositorThe Photoshop alternative for Mac项目地址: https://gitcode.com/gh_mirrors/compos/Compositor
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考