跳到主要内容

noimg(純 Nolang 圖像處理工具庫)

notools 倉庫內含一個純 Nolang 實現的圖像處理工具庫noimg/ 目錄),類似 libvips 的設計思路,支持多格式讀寫與豐富的圖像操作。

支持的格式

格式擴展名讀取寫入說明
PPM/PGM/PNM.ppm .pgm .pnmPortable Pixmap/Graymap(ASCII 與 Binary)
BMP.bmpWindows Bitmap(僅 24/32 位未壓縮)
TGA.tgaTarga(含 RLE 壓縮)
PAM.pamPortable Arbitrary Map
PNG.pngPortable Network Graphics(8 位,zlib 壓縮,CRC32 校驗,5 種掃描線濾鏡,支持 Adam7 隔行解碼)
TIFF.tif .tiffTagged Image File Format(僅未壓縮、8 位、單 strip)
GIF.gifGraphics Interchange Format(LZW 解碼+隔行+透明;動畫多幀提取+disposal 合成;寫入用 median-cut 量化)
JPEG.jpg .jpegbaseline JPEG 讀寫(DCT+Huffman 編碼/解碼+IDCT+YCbCr→RGB),不支持 progressive
WebP.webp⚠️⚠️VP8L lossless 解碼(Huffman+LZ77 距離+顏色快取+predictor 逆變換(14 模式)+顏色變換逆變換(定點乘)+subtract-green+顏色索引);不支持 lossy VP8;寫入為 VP8L 容器(真實像素跨碼),但 save 不寫 transform 頭(無 predictor/subtract-green/color-transform),與標準 WebP 解碼器不互通——僅 noimg save→noimg load 可 round-trip

CLI 命令

命令說明示例
info顯示圖像屬性noimg info photo.png
convert格式轉換noimg convert input.png output.jpg
resize調整大小(可選插值方法)noimg resize in.png out.png 800 600 1
thumbnail縮略圖(最大邊長)noimg thumbnail in.png out.png 128
rotate旋轉(90/180/270)noimg rotate in.png out.png 90
rot-free任意角度旋轉noimg rot-free in.png out.png 45.0
flip翻轉(h/v/both)noimg flip in.png out.png h
crop裁剪區域noimg crop in.png out.png 10 10 100 100
grayscale灰度轉換noimg grayscale in.png out.png
sepia棕褐色調復古效果noimg sepia in.png out.png
invert反色noimg invert in.png out.png
blur高斯模糊noimg blur in.png out.png 15
sharpen銳化noimg sharpen in.png out.png 150
edge邊緣檢測(Sobel)noimg edge in.png out.png
emboss浮雕效果noimg emboss in.png out.png
oil油畫效果noimg oil in.png out.png 3 32
median中值濾波noimg median in.png out.png 3
dilate形態學膨脹noimg dilate in.png out.png 2
erode形態學腐蝕noimg erode in.png out.png 2
gradient形態學梯度noimg gradient in.png out.png 2
vignette暗角效果noimg vignette in.png out.png 40
brightness亮度調整noimg brightness in.png out.png 20
contrast對比度調整noimg contrast in.png out.png 50
gammaGamma 校正noimg gamma in.png out.png 120
threshold二值化noimg threshold in.png out.png 128
posterize色階縮減noimg posterize in.png out.png 4
solarize日曬效果noimg solarize in.png out.png 128
hist-eq直方圖均衡化noimg hist-eq in.png out.png
hist-norm直方圖歸一化noimg hist-norm in.png out.png
hist-stretch直方圖拉伸noimg hist-stretch in.png out.png 1
auto-level自動色階noimg auto-level in.png out.png
auto-contrast自動對比度noimg auto-contrast in.png out.png 1
histogram列印直方圖noimg histogram in.png
stats圖像統計信息noimg stats in.png
entropy圖像香農熵noimg entropy in.png
composite圖像合成noimg composite base.png overlay.png out.png 10 10
pad添加邊框noimg pad in.png out.png 10
band提取單通道noimg band in.png out.png 0
add-alpha添加 Alpha 通道noimg add-alpha in.png out.png
flattenAlpha 混平(RGBA→RGB)noimg flatten in.png out.png
noise添加噪聲noimg noise in.png out.png 30
unsharp-maskUSM 銳化(帶閾值)noimg unsharp-mask in.png out.png 15 150 0
box-blur方框模糊noimg box-blur in.png out.png 3
laplacianLaplacian 邊緣檢測noimg laplacian in.png out.png
otsuOtsu 自動閾值二值化noimg otsu in.png out.png
adjust-hsvHSV 色彩調整noimg adjust-hsv in.png out.png 10 0 0
transpose矩陣轉置noimg transpose in.png out.png
scale獨立 x/y 縮放noimg scale in.png out.png 50 100
embed嵌入大畫布noimg embed in.png out.png 10 10 200 200
bandjoin2兩圖通道拼接noimg bandjoin2 r.png g.png out.png
roi-blend區域混合noimg roi-blend base.png overlay.png out.png 10 10 0 255
overlay-blendOverlay 混合noimg overlay-blend in.png overlay.png out.png
remove-alpha移除 Alpha 通道noimg remove-alpha in.png out.png
rgb2labRGB 轉 Labnoimg rgb2lab in.png out.png
lab2rgbLab 轉 RGBnoimg lab2rgb in.png out.png
rgb2cmykRGB 轉 CMYKnoimg rgb2cmyk in.png out.png
cmyk2rgbCMYK 轉 RGBnoimg cmyk2rgb in.png out.png
watermark文字水印noimg watermark in.png out.png "©2024" 4 2
to-u168-bit 轉 16-bitnoimg to-u16 in.png out.png
to-u816-bit 轉 8-bitnoimg to-u8 in.png out.png
animate創建動畫 GIFnoimg animate out.gif 20 f1.png f2.png f3.png

庫 API

noimg 可作為 Nolang 庫使用,通過 lib.no 導出以下模組:

模組職責
image圖像創建、複製、填充、像素讀寫、統計、常量運算、Alpha 通道管理、屬性檢查
pnmPPM/PGM/PNM 讀寫
bmpBMP 讀寫(24/32 位未壓縮)
tgaTGA 讀寫(含 RLE)
pamPAM 讀寫
gifGIF 讀寫(LZW 解碼+隔行+透明+動畫多幀+disposal+median-cut 量化+動畫寫出)
pngPNG 讀寫(zlib 壓縮、CRC32 校驗、5 種濾鏡、Adam7 隔行解碼,僅 8 位)
tiffTIFF 讀寫(僅未壓縮、8 位、單 strip)
jpegJPEG 讀寫(baseline DCT+Huffman 跨碼/解碼+IDCT+YCbCr→RGB,不支持 progressive)
webpWebP VP8L lossless 解碼
colour色彩空間轉換(RGB↔Gray、RGB↔HSV、RGB↔HSL、RGB↔YCbCr、RGB↔Lab、RGB↔CMYK)
resize雙線性縮放、縮略圖、縮放、最近鄰/雙三次/面積平均
rotate旋轉(90/180/270/任意角度)、翻轉、轉置/反對角轉置
composite裁剪、自動裁剪、合成、邊框、嵌入、通道合併/提取/選擇、Alpha 混平、ROI 混合
filter卷積、高斯模糊、方框模糊、銳化、Sobel/Laplacian 邊緣檢測、浮雕、中值濾波、油畫、噪聲、形態學
histogram直方圖查找/累積/列印、均衡化/歸一化/拉伸、自動色階/對比度
text位圖字體渲染、文字水印(5x7 點陣字體,9 種位置)

構建與運行

cd noimg
no build
# 產物位於 noimg/dist/noimg

# 示例:格式轉換
noimg/dist/noimg convert input.png output.jpg

# 示例:圖像處理
noimg/dist/noimg blur input.png blurred.png 15
noimg/dist/noimg grayscale input.png gray.png
noimg/dist/noimg resize input.png small.png 200 200

項目結構

noimg/
├── main.no ; CLI 入口與命令分發
├── lib.no ; 庫導出聲明
├── src/
│ ├── image.no ; 圖像核心結構與操作
│ ├── pnm.no ; PPM/PGM/PNM
│ ├── bmp.no ; BMP
│ ├── tga.no ; TGA
│ ├── pam.no ; PAM
│ ├── png.no ; PNG(CRC32 位運算、zlib)
│ ├── tiff.no ; TIFF
│ ├── gif.no ; GIF(LZW 編解碼)
│ ├── jpeg.no ; JPEG 讀寫
│ ├── webp.no ; WebP VP8L lossless 解碼
│ ├── colour.no ; 色彩空間轉換
│ ├── resize.no ; 縮放
│ ├── rotate.no ; 旋轉與翻轉
│ ├── composite.no ; 合成與裁剪
│ ├── filter.no ; 濾鏡
│ ├── histogram.no ; 直方圖與統計
│ └── text.no ; 文字渲染與水印
├── tests/
│ ├── test-core.no ; 核心圖像操作測試
│ ├── test-pnm.no ; PNM 格式往返測試
│ ├── test-colour.no ; 色彩空間轉換測試
│ ├── test-filter.no ; 濾鏡操作測試
│ ├── test-composite.no ; 合成操作測試
│ ├── test-histogram.no ; 直方圖操作測試
│ └── test-resize-rotate.no ; 縮放與旋轉測試
└── package.jsonc ; 項目配置