Rust 中的图像缩放库
使用 SIMD 和多线程在不同色彩空间中缩放 Rust 图像。
支持 NEON、SSE、AVX-2、AVX-512、AVX-VNNI、WASM。
色彩空间
本库为您提供在不同色彩空间中缩放的便捷功能。
提供 CIE L*a*b、CIE L*u*v、CIE L*c*h、线性、Sigmoidal、Oklab、Jzazbz 的预构建选项。
这些转换也非常高效。
建议在线性色彩空间中进行缩小。
放大可以在 LAB/LUB 和 Sigmoidal 化分量中进行,在 sRGB 中也很高效。
支持良好的 f16(IEEE 754-2008 中定义的“binary16”类型)。
与 image crate 的集成示例
let img = ImageReader::open("./assets/asset.png")
.unwrap()
.decode()
.unwrap();
let dimensions = img.dimensions();
let mut bytes = Vec::from(img.as_bytes());
let mut scaler = LinearScaler::new(ResamplingFunction::Lanczos3);
scaler.set_threading_policy(ThreadingPolicy::Single);
// ImageStore::<u8, 4> - (u8, 4) represents RGBA, (u8, 3) - RGB etc
let store = ImageStore::<u8, 4>::from_slice(&mut bytes, dimensions.0 as usize, dimensions.1 as usize).unwrap();
let mut dst_store = ImageStoreMut::<u8, 4>::alloc(dimensions.0 as usize / 2, dimensions.1 as usize / 2);
let plan = scaler.plan_rgba_resampling(
ImageSize::new(dimensions.0 as usize, dimensions.1 as usize), //source size
ImageSize::new(dimensions.0 as usize / 2, dimensions.1 as usize / 2), // target size
true, // premultiply alpha
).unwrap();
plan.resample(&store, &mut dst_store).unwrap();
使用 SIMD 的最快路径
尽管所有实现都很快,但并非所有路径都使用 SIMD 实现,因此某些路径速度较慢。 下表展示了哪些路径已使用 SIMD 实现。
~ - 部分实现
| NEON | SVE | SSE | AVX2 | AVX-512 | WASM | |
|---|---|---|---|---|---|---|
| RGBA (8 bit) | x | ~ | x | x | x(avxvnni) | x |
| RGB (8 bit) | x | ~ | x | x | x(avxvnni) | x |
| Plane (8 bit) | x | ~ | x | ~ | ~ | ~ |
| RGBA (8+ bit) | x | - | x | x | x(avxvnni) | - |
| RGB (8+ bit) | x | - | ~ | x | ~ | - |
| Plane (8+ bit) | x | - | ~ | x | ~ | - |
| Plane (S8+ bit) | x | - | - | x | - | - |
| RGBA (f32) | x | - | x | x | - | - |
| RGB (f32) | x | - | x | x | - | - |
| Plane (f32) | x | - | x | x | - | - |
| RGBA (f16) | x | - | x | x | - | - |
| RGB (f16) | x | - | ~ | ~ | - | - |
| Plane (f16) | ~ | - | ~ | ~ | - | - |
| AR30/RA30 | x | - | ~ | x | - | - |
特性
特性:
- 要启用对
f16的支持,应激活nightly_f16特性,并且需要nightly编译器。 nightly_avx512激活 AVX-512 特性集,并且需要nightly编译器通道。
具有运行时分发的目标特性
对于 x86 和 aarch64,使用 NEON 运行时分发。
neon 可选目标特性可用,在受支持的平台上编译时启用它以获取所有特性。
如果启用 avx2、fma、sse4.1、f16c,将自动检测,如果启用,将自动检测并使用最佳路径。
avx512 需要 avx512 编译器通道的特性,运行时检测如果可用则使用。
avxvnni 需要特性 avx512,如果可用将自动检测,无需额外操作,如果启用将自动检测并使用最佳路径。
AVX-VNNI 是现代 Intel 和 AMD CPU 上的有用扩展,考虑开启它以获取最大性能。
fullfp16、fhm NEON 目标检测在运行时执行,如果启用将自动检测,如果启用将自动检测并使用最佳路径。
WASM simd128 目标特性激活在构建标志中是强制性的。
关于 f16
要获得对 f16 的完整支持,应使用 nightly_f16 特性。
对于 NEON,f16 特性使用运行时检测,如果 CPU 支持此特性,则可用极快的路径
构建 C 绑定
有关更多信息,请参阅 picscale/include/picscale.h
cd picscale && RUSTFLAGS="-C strip=symbols" cargo +nightly build -Z build-std=std,panic_abort --release
重采样滤波器
支持 30 多种重采样滤波器。
Bilinear
Nearest
Cubic
MitchellNetravalli
CatmullRom
Hermite
BSpline
Hann
Bicubic
Hamming
Hanning
Blackman
以及其他
本项目采用以下任一许可证授权:
供您选择。