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:通过logcrate启用打印信息simd:启用对某些图像操作的SIMD支持,- 这仅启用明确编写的simd代码,而不启用编译器自动向量化,可能生成simd
threads:启用在多个线程中运行某些操作的支持,如果禁用此功能,则库可以在不支持线程的区域运行,例如wasmimage-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