#图像 #图像处理 #图像编码 #编码器 #编解码器 #解码器

zune-image

一个图像库,包含了解码、操作和编码图像所需的必要功能

8个版本

0.5.0-rc02024年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图像

Download history 68/week @ 2024-04-24 135/week @ 2024-05-01 90/week @ 2024-05-08 113/week @ 2024-05-15 187/week @ 2024-05-22 348/week @ 2024-05-29 452/week @ 2024-06-05 158/week @ 2024-06-12 62/week @ 2024-06-19 57/week @ 2024-06-26 70/week @ 2024-07-03 69/week @ 2024-07-10 83/week @ 2024-07-17 190/week @ 2024-07-24 276/week @ 2024-07-31 162/week @ 2024-08-07

每月721次下载
用于 2 个crate(通过zune-imageprocs

MIT OR Apache-2.0 OR Zlib

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:启用上述所有功能

DecoderTraitOperationsTraitEncoderTrait

这些特质封装了图像库预期执行的主要操作

  • 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