8个版本
0.5.0-rc0 | 2024年4月7日 |
---|---|
0.4.15 | 2024年2月17日 |
0.4.14 | 2024年1月15日 |
0.4.13 | 2023年12月3日 |
0.4.11 | 2023年11月17日 |
52 在 图像
每月721次下载
用于 2 个crate(通过zune-imageprocs)
590KB
10K SLoC
Zune-image
一个(有意见的)图像库
这是将大多数zune-
系列的图像解码器、编码器和图像处理器的图像库以及图像库的主要库
支持格式
格式 | 库 | 解码 | 编码 |
---|---|---|---|
BMP | zune-bmp | 是 | - |
Farbfeld | zune-farbfeld | 是 | 是 |
HDR | zune-hdr | 是 | 是 |
JPEG | zune-jpeg , jpeg-encoder | 是 | 是 |
JPEG-XL | zune-jpegxl, jxl-oxide | 是 | 仅限无损 |
PNG | zune-png | 是 | 是 |
PPM | zune-ppm | 是 | 是 |
QOI | zune-qoi | 是 | 是 |
功能
图像解码器和编码器
每个图像解码器和编码器都可以通过切换其功能来启用或禁用,例如,要仅包含jpeg解码和编码,可以使用
zune-image={version="0.4",default-features=false,features=["jpeg"]}
其他功能
serde
:启用对序列化图像元数据的serde支持,将serde
作为依赖项添加log
:通过log
crate启用打印信息simd
:启用对某些图像操作的SIMD支持,- 这仅启用明确编写的simd代码,而不启用编译器自动向量化,可能生成simd
threads
:启用在多个线程中运行某些操作的支持,如果禁用此功能,则库可以在不支持线程的区域运行,例如wasm
image-formats
:包括所有支持的图像格式的全局功能metadata
:启用解析exif数据,将kamadak-exif
作为依赖项添加all
:启用上述所有功能
DecoderTrait
、OperationsTrait
和 EncoderTrait
这些特质封装了图像库预期执行的主要操作
DecoderTrait
:任何实现此特质的项可以将图像解码为库的Image
表示形式OperationsTrait
:任何实现此特质的项可以操作Image
,并在必要时修改适当的字段EncoderTrait
:任何实现此特质的项可以将Image
编码到所需的功能
图像表示
所有图像都以 Image
结构表示,这无关紧要,无论图像是灰度、RGB、动画还是以 f32
表示,这允许轻松互操作性并简化API,但牺牲了略微复杂的内部API
您可以通过 from_
方法创建图像,或通过 Image.open
读取图像文件
示例
- 生成分形,与
image
包中的相同示例
use zune_core::colorspace::ColorSpace;
fn main() {
let img_x = 800;
let img_y = 800;
let scale_x = 3.0 / img_x as f32;
let scale_y = 3.0 / img_y as f32;
let mut image = zune_image::image::Image::from_fn(img_x, img_y, ColorSpace::RGB, |y, x, px| {
let r = (0.3 * x as f32) as u8;
let b = (0.3 * y as f32) as u8;
// colorspace channels are three, so we must set three pixels
px[0] = r;
px[1] = 0;
px[2] = b;
});
// This may actually be combined with the function `from_fn` above.
// But it tries to match the image example given as much as possible
//
// we have to annotate our image is `u8` so that it works
image
.modify_pixels_mut::<u8, _>(|y, x, px| {
let cx = y as f32 * scale_x - 1.5;
let cy = x as f32 * scale_y - 1.5;
let c = num_complex::Complex::new(-0.4, 0.6);
let mut z = num_complex::Complex::new(cx, cy);
let mut i = 0;
while i < 255 && z.norm() <= 2.0 {
z = z * z + c;
i += 1;
}
// write it
*px[1] = i as u8;
})
.unwrap();
image.save("./fractals.jpg").unwrap();
}
依赖项
~125–680KB
~14K SLoC