Skip to content

Repository files navigation

ImageWorkshop(图像工坊)

macOS 图像处理应用:Core Image 滤镜库、图片编辑、实时拍摄、扫码识别、照片库管理,一套界面里完成「滤镜 → 编辑 → 保存 → 管理」的完整流程。

功能

  • 滤镜:收录 Core Image 内置滤镜(中文名展示),支持滤镜链组合、参数调节、预设保存、批量应用/导出/导入;支持 Filter Graph JSON(AI/用户用 JSON 描述滤镜组合,引擎自动校验并执行)
  • 图片编辑:底图 + 贴纸图层管理(选中/拖动/缩放/旋转)、涂鸦、抠图、插入图片、撤销/重做、保存替换
  • 拍摄:相机实时滤镜、道具贴纸(人脸锚点/位置配置)、视频滤镜处理
  • 扫描:二维码/条形码识别、图片文字识别(OCR)、扫描线动画
  • 照片库:相簿/相册管理(多选、合并、移动、删除、重命名)、批量导入图片或文件夹、宫格自适应布局、照片查看器
  • 动画/幻灯片:可复用动画引擎(114 项效果目录、关键帧/时间线/转场)、照片墙 7 种布局切换与批量入场、相册幻灯片(多种转场 + 每张照片可独立设置动画 + 视频导出),预览与成片同源
  • 动画库:顶部「动画」模式集中演示入场/布局/相簿/转场/蒙版/色彩/3D/手势拖拽等效果,布局实时形变、堆叠轮播、Rolodex、视差倾斜均可交互
  • 我的幻灯片:图库「幻灯片」分栏,从本地/系统相册/我的相簿导入照片,拖拽排序、框选删除、撤销重做、逐张动画 + 参数调整、Ken Burns、模板、节拍对齐、转场、背景音乐、自定义 Lottie 模板、预览与导出(含音乐、分辨率/帧率可选)
  • 其他:人脸检测与标注、RAW 处理、预编译 Metal 内核库(50 个着色器)

环境要求

  • macOS 14.0+
  • Xcode 16+(工程使用文件夹同步,新增文件无需改 pbxproj)
  • iOS 17.0+(核心包与全部 App 源码均已通过 iOS 编译,AppRootView 导航壳/选择器/URL Scheme 已就位; 待建 Xcode iOS target 即可运行,详见 iOS 适配设计

快速开始

open ImageWorkshop.xcodeproj

选择 ImageWorkshop scheme 运行。图片页可拖入图片或从图库选择,左侧选滤镜、中间编辑、右侧调参。

命令行构建:

xcodebuild -project ImageWorkshop.xcodeproj -scheme ImageWorkshop \
  -configuration Debug -derivedDataPath .build CODE_SIGNING_ALLOWED=NO build

发布版本

测试

Xcode 内 ⌘U 运行单元测试;也可用 SwiftPM 测试 harness(当前 344 通过 / 2 跳过):

CLANG_MODULE_CACHE_PATH=/private/tmp/clang-modcache swift test \
  --package-path .build/harness \
  --scratch-path /private/tmp/iw-harness-build \
  --cache-path /private/tmp/iw-harness-cache \
  --disable-sandbox -Xswiftc -disable-sandbox

修改源码后需先同步到 harness 再跑:rsync -a --delete 对应目录到 .build/harnessSources/ImageWorkshopCoreSources/ImageWorkshopTests/ImageWorkshopTests)。

滤镜图(Filter Graph JSON)

滤镜组合可以用一份 JSON「施工图」描述。引擎按能力目录自动校验并映射: 无前缀的 typeCore Image 滤镜,metal. 前缀走预编译 Metal 内核(50 个), lut 走 LUT 资产(16 个内置)。同一份 JSON 自动适配执行代码,不需要改任何源码。

示例:纯 Core Image(电影感)

{
  "schemaVersion": 2,
  "name": "电影感",
  "nodes": [
    {"id": "n1", "type": "contrast", "params": {"value": 1.15}},
    {"id": "n2", "type": "bloom", "params": {"intensity": 0.4, "radius": 8}},
    {"id": "n3", "type": "vignette", "params": {"intensity": 0.5}}
  ]
}

示例:Metal 内核 + LUT(霓虹胶片)

{
  "schemaVersion": 2,
  "name": "霓虹胶片",
  "nodes": [
    {"id": "n1", "type": "lut", "params": {"asset": "teal_orange"}},
    {"id": "n2", "type": "metal.chromaticAberration", "params": {"amount": 3}},
    {"id": "n3", "type": "metal.bloom", "params": {"intensity": 1.2, "threshold": 0.6}},
    {"id": "n4", "type": "metal.grain", "params": {"amount": 0.4, "seed": 42}}
  ]
}

导入方式:图片页工具栏「滤镜图」→ 导入 JSON(校验失败会给出稳定错误码);也可通过外部端口(Apple Events)命令行调用:

osascript -e 'tell application "ImageWorkshop" to «event IWFTexec» "{\"input\":\"/tmp/in.jpg\",\"output\":\"/tmp/out.jpg\",\"graph\":{\"schemaVersion\":2,\"name\":\"x\",\"nodes\":[{\"id\":\"n1\",\"type\":\"exposure\",\"params\":{\"ev\":0.5}}]}}"'

完整的 JSON Schema、节点参考(名称/后端/属性类型/取值范围/默认值)见 docs/FILTER_GRAPH_SCHEMA.md(由脚本从代码生成,与引擎能力严格一致; 改动节点后运行 bash Scripts/generate_filter_graph_docs.sh 刷新)。

可直接导入的示例文件在 Examples/FilterGraphs/(6 个,均已通过引擎校验): 电影感.json赛博朋克.json日系胶片.json黑白电影.json霓虹颗粒.json复古暖调.json

机器可读文件:

工程结构

ImageWorkshop/                # App target(Presentation 层)
  App/                        # 依赖注入组合根
  Presentation/               # 视图 + ViewModel(Editor/Camera/Scan/PhotoLibrary…)
Sources/                     # 仓库根级 SwiftPM 包(可被其它工程引用)
  ImageWorkshopDomain/        # 实体/值对象/协议(零依赖)
  ImageWorkshopCommon/        # 错误/日志/术语
  ImageWorkshopApplication/   # 用例/交互器/编排
  ImageWorkshopInfrastructure/# Core Image / Vision / 视频 / SwiftData 实现
  ImageWorkshopCore/          # 伞形目标(@_exported,保持单入口)
Package.swift                 # 根级包清单(5 个可复用产品)
ImageWorkshopTests/           # 单元测试
Scripts/                      # 测试素材生成等脚本
TestAssets/PhotoLibraries/    # 本地生成的测试图库(9 相册 × 10 张)

作为依赖被其它工程引用

本仓库根目录即 SwiftPM 包(Package.swift 在仓库根),其它工程可直接以仓库为依赖, 按需复用 5 个产品:

// Package.swift(其它工程)
dependencies: [
    .package(url: "https://github.com/你的账号/ImageWorkshop.git", branch: "main")
]
targets: [
    .target(
        name: "MyApp",
        dependencies: [
            .product(name: "ImageWorkshopDomain", package: "ImageWorkshopCore"),   // 纯领域
            .product(name: "ImageWorkshopApplication", package: "ImageWorkshopCore"), // 用例/编排
            .product(name: "ImageWorkshopInfrastructure", package: "ImageWorkshopCore"), // CI/视频/Vision 实现
            // 或整包入口:.product(name: "ImageWorkshopCore", ...)
        ]
    )
]
// 代码内按需 import(推荐按模块,避免伞形全家桶)
import ImageWorkshopDomain
import ImageWorkshopApplication

文档索引

文档

About

a nestjs demo for study

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages