3个版本 (破坏性)

0.3.0 2020年1月21日
0.2.0 2019年1月10日
0.1.0 2018年11月9日

#233 in 压缩


wayk_core 中使用

MIT/Apache

205KB
5K SLoC

gfwx-rs

crates.io docs build codecov

由Graham Fyffe开发的GFWX图像压缩算法的实现。库使用rayon作为默认功能进行并行化。

入门

先决条件

要使用此库,您需要在您的计算机上安装Rust。库在稳定版Rust分支上工作,不需要夜间版。

使用

gfwx-rs可在crates.io上找到。推荐的用法是在Cargo.toml中添加一行,例如

[dependencies]
gfwx = "0.2"

或者,如果您不想使用rayon

[dependencies]
gfwx = { version = "0.2", default-features = false }

压缩的基本用法

extern crate gfwx;

fn main() {
    let image = ...;

    let builder = gfwx::HeaderBuilder {
        width: image.width(),
        height: image.height(),
        layers: 1,
        channels: image.channels(),
        quality: gfwx::QUALITY_MAX,
        chroma_scale: 8,
        block_size: gfwx::BLOCK_DEFAULT,
        filter: gfwx::Filter::Linear,
        encoder: gfwx::Encoder::Turbo,
        intent: gfwx::Intent::RGBA,
        metadata_size: 0,
    };
    let header = builder.build().unwrap();

    let buffer = vec![0; 2 * image.len()]; // 2 times original size should always be enough
    header.encode(&mut buffer)?;
    let gfwx_size = gfwx::compress_simple(
        image.as_slice(),
        &header,
        &gfwx::ColorTransformProgram::new(), // no color transform
        &mut buffer,
    ).unwrap();
    buffer.truncate(gfwx_size);
}

解压缩的基本用法

extern crate gfwx;

fn main() {
    let mut compressed = ...;

    let header = gfwx::Header::decode(&mut compressed).unwrap();

    let mut decompressed = vec![0; header.get_estimated_decompress_buffer_size()];
    let next_point_of_interest = gfwx::decompress_simple(
        &mut compressed,
        &header,
        0, // no downsamping
        false, // do not test, full decompress
        &mut decompressed,
    ).unwrap();

    ...
}

运行测试

单元测试

要运行单元测试

cargo test

还有在构建应该失败的情况下进行的测试。您可以使用以下命令运行它们

cargo test --features test_build_fails

功能测试

要运行功能测试,可以使用实际图像,可以使用ci/func_tests.sh

ci/func_tests.sh ci/test_images/

此命令将在/tmp/gfwx目录中的ci/test_images/文件夹中构建参考应用程序、构建示例并运行使用准备好的图像的功能测试(因此工作目录保持清洁)。

基准测试

还有可以使用以下命令运行的criterion基准测试

cargo bench

示例

示例文件夹包含3个应用程序

  1. compress - 将输入图像压缩为gfwx
  2. decompress - 解压缩gfwx文件
  3. compare - 比较两个图像,不包括元数据。对于比较输入图像和解压缩后的图像很有用,因为它们可能有相同的“像素”,但不同的元数据,这意味着这些文件将具有不同的校验和

功能

库支持原始实现的所有功能,但以下除外

  • 它仅支持u8数据,而原始实现支持8位和16位数据,包括有符号和无符号
  • 不支持Bayer模式

然而,原始实现仅支持交错格式的通道(例如,[R1, G1, B1, R2, B2, G2, ...])并且总是将通道转换为平面格式。这对于已经使用平面通道格式的颜色空间(例如,YUV420)来说并不适用。

对于此类数据,我们的库提供了低级 compress_aux_datadecompress_aux_data 函数。这些函数不编码标题,执行和编码 ColorTransformProgram,并接受已应用增强的平面通道格式的16位图像数据。

这些函数使用起来稍微复杂一些,但在您只需要图像数据的压缩和解压缩时,提供了更多的灵活性。您可以使用 Header::encode() 手动编码标题,使用 ColorTransformProgram::encode() 编码 ColorTransformProgram 并执行它,以及使用 ColorTransformProgram::transform()(对于平面通道)和 ColorTransformProgram::transform_and_to_planar()(对于交错通道)应用增强。此外,您可以使用 interleaved_to_planar()planar_to_interleaved(),这两个函数也可以在转换过程中跳过一些通道(例如,跳过 RGBA 中的 Alpha 通道)。

您可以在 examples/test_app.rs 中找到如何使用这些函数的完整示例,或者在 src/lib.rs 中查看 compress_simpledecompress_simple 的实现。

依赖项

~3.5MB
~76K SLoC