MoonBit image library: pure MoonBit backend for native/wasm-gc/js/wasm multi-target support.
意义:评审看到的每个版本测试数增长(3378 → 6574)背后,有一条可复现的自动化工程流水线——这是"工程质量"维度最硬的证据,也是 stb_image.h 等 C 参照项目不具备的能力。
🌱 生态采用:已被 moonrockz/diagrams-raster 依赖
| 格式 | 解码 | 编码 | 备注 |
|---|---|---|---|
| PNG | ✅ | ✅ | 8/16-bit,Adam7 隔行扫描 |
| JPEG | ✅ | ✅ | baseline,可调质量 |
| BMP | ✅ | ✅ | 1/4/8/16/24/32-bit |
| GIF | ✅ | ✅ | 动画 GIF 解码/编码 |
| QOI | ✅ | ✅ | Quite OK Image |
| TGA | ✅ | ✅ | 含 RLE |
| PSD | ✅ | — | Photoshop 文档 (独家) |
| HDR | ✅ | ✅ | IEEE 754 浮点 (独家) |
| PNM | ✅ | ✅ | PPM / PGM |
| TIFF | ✅ | ✅ | 无压缩/LZW/PackBits |
| ICO | ✅ | ✅ | 单尺寸/多尺寸 |
| CUR | ✅ | ✅ | Windows 光标 |
| ICNS | ✅ | ✅ | macOS 图标 |
| APNG | ✅ | ✅ | 动画 PNG |
| WebP | ✅ (lossless) | ✅ (lossy VP8) | VP8L 解码 + VP8 编码 |
| AVIF | ✅ | — | AV1 关键帧解码 |
| HEIF | ✅ | — | AV1/HEIC 解码 |
| JPEG-XL | ✅ | — | 基础解码 |
moon add walkzzz/image🧩 子模块按需安装(0.6.0 起,workspace 六模块独立发布):moon add walkzzz/codec 只装 18 格式编解码;moon add walkzzz/process 只装 90+ 算法子包;core / photography / vision / domain 同理。
import "walkzzz/core/types"
import "walkzzz/codec/lib"
import "walkzzz/process/filter"
import "walkzzz/process/transform"
// 解码 — 自动检测 18 种格式
let img : Image = @lib.load_from_bytes_auto(data)
// 处理 — 滤波 / 缩放 / 旋转
let blurred = @filter.gaussian_blur(img, 3.0)
let resized = @transform.resize(img, 256, 256)
// 编码 — 输出为 PNG 字节
let out : Bytes = @lib.write_png_to_bytes(resized)try {
let img = @lib.load_from_bytes(data)
} catch {
LoadError::FileIO(msg) => println("IO 错误: \{msg}")
LoadError::DecodeFailed(msg) => println("解码失败: \{msg}")
LoadError::UnsupportedFormat(msg) => println("不支持的格式: \{msg}")
}import "walkzzz/process/feature"
// 检测 SIFT 特征
let kp1 = @feature.sift_detect(img1)
let kp2 = @feature.sift_detect(img2)
// L2 距离 + Lowe 比率测试匹配
let matches = @feature.sift_match(kp1, kp2, ratio_threshold=0.75)
// RANSAC 鲁棒单应性估计
let homography = @feature.ransac_homography(matches, threshold=5.0, iterations=1000)import "walkzzz/codec/lib"
// 逐行回调(当前为全量解码后逐行分发,v5.0 计划增量解码)
@lib.decode_stream(data, fn(row, y) {
// 处理第 y 行像素 row : Array[Array[Int]]
})graph TD
CORE["<b>core</b><br/>基础类型<br/>Image · Image16 · ImageF"] --> CODEC["<b>codec</b><br/>编解码<br/>18 格式 · 色彩 · 元数据"]
CODEC --> PROCESS["<b>process</b><br/>图像处理<br/>滤波 · 边缘 · 特征 · 分割"]
PROCESS --> PHOTO["<b>photography</b><br/>计算摄影<br/>HDR · 融合 · 拼接 · 风格迁移"]
PROCESS --> VISION["<b>vision</b><br/>计算机视觉<br/>OCR · 人脸 · SLAM · 场景"]
VISION --> DOMAIN["<b>domain</b><br/>领域应用<br/>医学 · 遥感 · 取证 · 配准"]
style CORE fill:#4CAF50,color:#fff,stroke:#388E3C
style CODEC fill:#2196F3,color:#fff,stroke:#1565C0
style PROCESS fill:#FF9800,color:#fff,stroke:#E65100
style PHOTO fill:#9C27B0,color:#fff,stroke:#6A1B9A
style VISION fill:#F44336,color:#fff,stroke:#C62828
style DOMAIN fill:#607D8B,color:#fff,stroke:#37474Fwalkzzz/image (根模块 — 门面,不做 reexport)
├── core/ # L0: 基础类型
│ └── types/ # Image, Image16, ImageF, LoadError, Pixel
├── codec/ # L1: 编解码
│ ├── codec/ # 18 格式编解码 (png/ jpeg/ bmp/ gif/ ...)
│ ├── lib/ # 高层封装 (自动格式分派 + 流式解码)
│ ├── color/ # 色彩空间转换
│ ├── meta/ # EXIF/XMP/IPTC/PNG text
│ ├── barcode/ # QR/条码
│ └── util/ # resize/zlib/配置
├── process/ # L2: 图像处理
│ ├── color/ # 色彩/CLAHE/Retinex/去雾
│ ├── filter/ # 滤波/去噪
│ ├── edge/ # 边缘/Canny/霍夫
│ ├── feature/ # Harris/ORB/SIFT/光流
│ ├── segment/ # 分水岭/SLIC/grabCut
│ ├── transform/ # 几何/透视/Seam Carving
│ ├── frequency/ # FFT/DCT/小波
│ ├── enhance/ # 修复/去雾/降噪
│ ├── detection/ # 检测/跟踪
│ └── stereo3d/ # 立体视觉
├── photography/ # L3a: 计算摄影
│ ├── photo_enhance/ # HDR/照片增强
│ ├── superres/ fusion/ stitch/ style_transfer/ inpainting/
│ └── computational_imaging/ neural_rendering/ compression/ quality/
├── vision/ # L3b: 计算机视觉
│ ├── ocr/ # OCR 全链路 (36 模块文件)
│ ├── face_recognition/ slam/ video/ scene_understanding/
│ └── spatiotemporal/ vlm_multimodal/ fieldimg/ imgir/ aoci/
└── domain/ # L4: 领域应用
├── medical/ remote_sensing/ encryption/ watermark/
├── forensics/ registration/ retrieval/ pipeline/
├── texture/ mesh/ point_cloud/ agent_kit/ self_evolve/
└── performance/ production_utils/ util/// 直接 import 子模块包 — 清晰、按需、零耦合
import "walkzzz/core/types" // @types.Image
import "walkzzz/codec/lib" // @lib.load_from_bytes_auto()
import "walkzzz/process/filter" // @filter.gaussian_blur()
import "walkzzz/process/feature" // @feature.sift_detect()
import "walkzzz/vision/ocr" // @ocr.recognize_text()| 类别 | 算法 |
|---|---|
| 滤波 | 方框 · 高斯 · 中值 · 双边 · Gabor · NLM 去噪 |
| 边缘 | Sobel · Canny · 霍夫变换 · 轮廓提取 |
| 特征 | Harris · ORB · SIFT · 模板匹配 · 光流 · GLCM · LBP · Hu 矩 |
| 分割 | 分水岭 · SLIC 超像素 · grabCut · K-means · 连通域 |
| 频域 | FFT · DCT · Haar 小波 · 频率滤波 |
| 变换 | 仿射 · 透视 · Seam Carving · 金字塔 |
| 增强 | CLAHE · Retinex(SSR/MSR/MSRCR) · 去雾 · 图像修复 |
| 色彩 | HSV · HSL · YCbCr · XYZ · Lab · CMYK · 自适应阈值 |
| 阶段 | 功能 |
|---|---|
| 预处理 | Sauvola/Niblack/Otsu 二值化 · 文档增强 · 倾斜校正 · 版面分析 |
| 检测 | 连通域 · 投影分析 · 文本行检测 · 字符分割 |
| 特征 | HOG · LBP · 投影特征 · 网格特征 · 统计特征 · 组合特征 |
| 分类 | KNN · 模板匹配 · 4 种距离度量 · 归一化/标准化 |
| 识别 | 数字 OCR(0-9) · 英文(36+字符) · 中文(500+常用字) |
| 后处理 | 词典匹配 · N-gram · 拼写纠错 · 混淆字符纠错 |
| 扩展 | 表格识别 · 文档理解 · 手写体 · 多语言混合 · Hu 矩 · 集成学习 |
| 目标 | 后端 | 测试 | 状态 |
|---|---|---|---|
| native | 纯 MoonBit | 6,486 | ✅ |
| wasm-gc | 纯 MoonBit | 6,486 | ✅ |
| js | 纯 MoonBit | 6,486 | ✅ |
| wasm | 纯 MoonBit | 6,486 | ✅ |
同一代码库,无条件编译,四目标共用所有源码。
| stb_image.h | walkzzz/image | |
|---|---|---|
| 语言 | C | MoonBit |
| 依赖 | C 编译器 | 零 C 依赖 |
| 目标 | native | native / wasm-gc / js / wasm |
| 格式数 | 7 | 18 |
| 像素深度 | 8-bit | 8-bit + 16-bit + HDR float |
| 流式解码 | ❌ | ✅ |
| 计算机视觉 | ❌ | ✅ (Canny/SIFT/ORB/光流/RANSAC...) |
| 频域分析 | ❌ | ✅ (FFT/DCT/小波) |
| 图像分割 | ❌ | ✅ (分水岭/SLIC/grabCut) |
| OCR | ❌ | ✅ (全链路: 数字/英文/中文/表格/手写体) |
| 形式化验证 | ❌ | ✅ (moon prove: 5 goals proved, 溢出安全/像素钳制/索引检查/旋转恒等) |
| 内存安全 | 手动 | GC 管理 |
| 文档 | 说明 |
|---|---|
| docs/architecture.md | 架构图、模块依赖、设计决策 |
| docs/api_reference.md | 完整 API 参考 |
| docs/roadmap.md | 迭代路线图 |
| docs/changelog.md | 版本变更历史 |
| docs/proposal.md | 季度评选申报书 |
| docs/pitfall-catalog.md | MoonBit 语法演进 + 工程实测陷阱(15 条) |
| docs/comparison.md | mooncakes.io 图像库对比 |
| docs/performance_report.md | 性能基准报告 |
| docs/notes.md | 使用说明与核心约束 |
| docs/examples.md | 示例集 |
| docs/features.md | 功能分类概览 |
| docs/contributing.md | 贡献指南 |
| docs/skill.md | AI 辅助开发说明 |
# 编译检查(四目标)
moon check && moon check --target wasm-gc && moon check --target js && moon check --target wasm
# 运行测试(6,486 × 4 目标)
moon test --target native
moon test --target wasm-gc
moon test --target js
moon test --target wasm
# 性能基准
moon run --target native
# API 接口生成
moon info
# 形式化验证(需安装 Why3 + z3/cvc5)
moon prove core/types
# 格式化
moon fmtlet version : Stringimport "walkzzz/codec/lib"
import "walkzzz/core/types"
let img = @lib.load_from_bytes_auto(bytes)!
let blurred = @lib.gaussian_blur(img, 3.0)| 模块 Module | 说明 Description | 导入 Import |
|---|---|---|
| core | 基础类型(Image, Image16, ImageF, LoadError)Base types | walkzzz/core/types |
| codec | 编解码、色彩、元数据、条码 Encoding/decoding, color, metadata, barcode | walkzzz/codec/lib |
| process | 图像处理算法 Image processing algorithms | walkzzz/process/filter |
| photography | 计算摄影 Computational photography | walkzzz/photography/photo_enhance |
| vision | 计算机视觉 Computer vision | walkzzz/vision/ocr |
| domain | 领域应用 Domain-specific applications | walkzzz/domain/medical |
Install
Download zipMoonBit image library: pure MoonBit backend for native/wasm-gc/js/wasm multi-target support.