
项目仓库:https://github.com/lizongying/notools/tree/main/noimg
定位:类libvips设计思想,全部图像格式编解码器、图像算子全部Nolang原生手写实现,不链接libpng/libjpeg/libwebp/zlib等任何外部C库,可编译为独立单二进制,适配Agent、脚本、服务器、本地开发者多场景。
一、背景:传统图像处理库的工程痛点
绝大多数图像处理工具都依赖C生态库:libpng、libjpeg‑turbo、libwebp、zlib、libtiff。
带来一系列现实工程负担:
- 分发噩梦:部署环境必须预装系统库;容器、Agent沙箱、Windows/macOS离线环境缺失依赖直接无法运行;静态链接会急剧膨胀二进制,还会出现符号冲突、许可证问题。
- 交叉编译复杂:每一个依赖库都要维护一套交叉编译脚本,多架构(amd64/arm64 Linux/macOS/Windows)维护成本极高。
- 许可证纠缠:LGPL类库静态链接会带来合规风险。
- Agent场景不友好:AI Agent运行环境经常是极简沙箱,没有权限安装系统包,很难调用系统图像处理工具。
noimg的解决思路:全部底层算法、格式解析在Nolang内部手写,不调用任何外部图像类库;最终产出单个独立可执行文件,开箱即用。
依托Nolang无GC、延迟move内存安全模型,图像内存自动生命周期管理,没有内存泄漏、野指针风险。
二、格式支持(9种图像格式,读写完整实现)
全部格式解析逻辑手写,没有外包给外部库。
| 格式 | 读取 | 写入 | 实现细节硬核点 |
|---|---|---|---|
| PPM / PGM / PNM | ✅ | ✅ | 支持ASCII与二进制两种变体,便携式朴素图像格式 |
| BMP | ✅ | ✅ | Windows BMP 24/32bit,解析DIB头,处理BGR↔RGB通道翻转 |
| TGA | ✅ | ✅ | 支持RLE行程压缩TGA解码与编码 |
| PAM | ✅ | ✅ | Portable Arbitrary Map通用多波段图像格式 |
| PNG | ✅ | ✅ | 8位图像;完整实现5种PNG扫描线滤镜;内置手写zlib/deflate解压、CRC32校验;解析IHDR/IDAT/IEND全部chunk块 |
| TIFF | ✅ | ✅ | 解析TIFF IFD标签体系,处理不同位深、多标签元数据 |
| GIF | ✅ | ✅ | 完整LZW压缩/解压缩实现;读取写入GIF图像 |
| JPEG | ✅ | ✅ | Baseline JPEG,手写Huffman编解码、DCT离散余弦变换、YCbCr<‑>RGB色彩空间转换 |
| WebP | ✅ | ✅ | RIFF容器解析,VP8 / VP8L头部解析,读取写入WebP图像 |
重点说明:PNG、GIF、JPEG、WebP的压缩熵编码全部在Nolang内部实现,不依赖系统zlib,这是区别于绝大多数项目的关键点。
三、图像算子能力(30+种图像处理操作)
noimg不只是“格式转换器”,提供完整图像处理流水线,分为:基础图像操作、几何变换、色彩处理、卷积滤镜、直方图统计、图像合成。
1.几何变换
resize:双线性插值缩放,不是简单最近邻;图像放大缩小质量更高thumbnail:生成缩略图,按最大边长约束,适合Agent批量处理图片rotate:90° /180° /270°旋转flip:水平、垂直翻转crop:任意区域裁剪pad:图像边框填充扩展
2.色彩空间与像素调整
grayscaleRGB转灰度invert颜色反色brightness亮度调整contrast对比度调整gammaGamma校正threshold二值化阈值分割posterize色阶缩减solarize日晒效果- 色彩空间转换:RGB ↔ Gray、RGB ↔ HSV、RGB ↔ HSL、RGB ↔ YCbCr
3.卷积与图像滤镜(全部手写卷积内核)
blur高斯模糊(自定义sigma)sharpen图像锐化edgeSobel算子边缘检测,计算图像梯度幅值emboss浮雕效果median中值滤波,去除椒盐噪声oil油画特效noise添加图像噪声
4.直方图与图像统计
histogram输出各通道直方图hist‑eq直方图均衡化hist‑norm直方图归一化stats图像统计信息:均值、方差、标准差band提取单颜色通道
5.图像合成
composite图层合成,支持指定叠加坐标,实现水印、贴图。
四、两套使用形态:CLI命令行工具 + Nolang库API
形态A:独立CLI二进制 noimg(可直接分发)
编译输出单文件二进制,无需任何依赖,跨平台Linux/macOS/Windows。
# 格式转换
noimg convert input.png output.jpg
# 生成缩略图
noimg thumbnail photo.png thumb.png 256
# 高斯模糊
noimg blur in.png out.png 12
# 查看图像元信息(宽高、通道、位深)
noimg info test.webp
形态B:作为Nolang库导入使用
lib.no对外导出全套模块,可以嵌入Nolang程序内部做图像处理,不需要调用子进程。
模块划分:image图像内存模型;pnm/bmp/tga/pam/png/tiff/gif/jpeg/webp各个格式编解码;colour色彩转换;resize/rotate几何变换;filter卷积滤镜;histogram直方图统计;composite图像合成。
图像内存由Nolang内存安全系统接管:图像对象离开作用域自动释放,无GC,无需手动free,杜绝内存泄漏、悬垂引用,这是C/C++图像处理库很难天然做到的安全特性。
五、架构与硬核工程设计亮点
零外部C库依赖
所有编解码器、压缩算法、滤镜算子全部Nolang源码实现。编译产物单文件,部署时不需要装任何系统图像包,非常适合AI Agent沙箱、容器、CI流水线。跨平台一次编译多目标
借助Nolang+Zig‑CC工具链,可同时产出linux‑amd64 / linux‑arm64 / darwin‑amd64 / darwin‑arm64 / windows‑amd64 / windows‑arm64预编译二进制。Windows下不需要dll;macOS只依赖系统libSystem;Linux gnu动态链接glibc,也可编译musl静态版本实现完全独立。内存安全模型
Nolang延迟move、作用域自动释放。图像大像素缓冲区,离开作用域自动回收;禁止手动free;不存在use‑after‑free,不需要GC。处理大量图片循环不会内存泄漏。错误处理
图像损坏、截断文件、非法格式不会直接进程崩溃;返回可捕获业务错误,适合Agent批量处理大量不可信网络图片。集成进notools生态
和nogit(纯Nolang Git实现)同为notools子项目。notools整个套件:系统工具集+git实现+图像处理,全部单二进制,面向AI Agent完整能力底座。
六、适用场景
- AI Agent执行环境:沙箱环境没有系统工具,需要做图片下载、缩略图生成、格式转换、图像预处理;直接调用noimg子命令或者库API。
- CI / 自动化脚本:跨平台流水线,不想安装libvips、imagemagick一堆系统依赖。
- 轻量服务后端:小体量图片预处理,不需要重量级OpenCV/libvips。
- 离线、嵌入式、极简容器:环境无法apt‑get / yum安装第三方库。
- 学习研究图像格式:全部编解码逻辑Nolang可读源码,没有黑盒C库,可以阅读每一步png/gif/jpeg解析流程。
七、现状与局限(客观)
- JPEG目前是baseline实现,不支持progressive jpeg。
- PNG目前只支持8bit深度;更高位深尚未实现。
- 没有实现多线程并行处理,单线程执行;追求超大图超高吞吐场景性能弱于libvips。
- 暂不支持HEIC、AVIF等较新格式,后续可迭代增加。
定位不是要完全替代libvips,而是提供零依赖、可单文件分发、内存安全的轻量级图像处理栈,尤其适配Agent这类特殊运行环境。
八、快速开始示例
源码构建(本地Nolang环境)
cd noimg
no build
./dist/noimg info demo.png
./dist/noimg resize demo.png out.png 800 600
使用预编译Release二进制
从notools项目GitHub Release下载对应平台noimg‑xxx,直接赋予执行权限即可运行,无需安装任何依赖。
九、同类项目横向对比
| 项目 | 语言 | 外部依赖 | 分发形式 | 内存安全 |
|---|---|---|---|---|
| noimg | Nolang | 零图像类第三方库 | 单二进制 | ✅ Nolang内存安全,无GC自动释放 |
| libvips | C | libpng/libjpeg/libwebp/zlib等 | 系统库,需要部署依赖 | ❌手动管理C内存 |
| stb_image | C | 部分格式依赖zlib | 头文件库 | ❌C手动内存管理 |
| ImageMagick | C | 大量第三方库 | 庞大二进制,依赖系统库 | ❌C手动内存管理 |
noimg最大差异化价值:把一整套图像栈完整移植到安全系统语言,去掉全部C图像库依赖,面向Agent/自动化场景做单文件分发。