3个版本 (破坏性)
0.3.0 | 2020年1月21日 |
---|---|
0.2.0 | 2019年1月10日 |
0.1.0 | 2018年11月9日 |
#233 in 压缩
在 wayk_core 中使用
205KB
5K SLoC
gfwx-rs
由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个应用程序
compress
- 将输入图像压缩为gfwxdecompress
- 解压缩gfwx文件compare
- 比较两个图像,不包括元数据。对于比较输入图像和解压缩后的图像很有用,因为它们可能有相同的“像素”,但不同的元数据,这意味着这些文件将具有不同的校验和
功能
库支持原始实现的所有功能,但以下除外
- 它仅支持u8数据,而原始实现支持8位和16位数据,包括有符号和无符号
- 不支持Bayer模式
然而,原始实现仅支持交错格式的通道(例如,[R1, G1, B1, R2, B2, G2, ...])并且总是将通道转换为平面格式。这对于已经使用平面通道格式的颜色空间(例如,YUV420)来说并不适用。
对于此类数据,我们的库提供了低级 compress_aux_data
和 decompress_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_simple
和 decompress_simple
的实现。
依赖项
~3.5MB
~76K SLoC