#png #codec #decoder #encoder #cargo-toml #encoding

lodepng

无需系统依赖项即可读取和写入 PNG 文件。LodePNG 的纯 Rust 版本。

46 个稳定版本

3.10.5 2024 年 8 月 18 日
3.10.2 2024 年 7 月 7 日
3.10.1 2024 年 1 月 22 日
3.9.2 2023 年 11 月 20 日
0.3.1 2015 年 2 月 8 日

34图像 中排名

Download history 7101/week @ 2024-05-04 6521/week @ 2024-05-11 5885/week @ 2024-05-18 6448/week @ 2024-05-25 8141/week @ 2024-06-01 7377/week @ 2024-06-08 9398/week @ 2024-06-15 8245/week @ 2024-06-22 8844/week @ 2024-06-29 8781/week @ 2024-07-06 8372/week @ 2024-07-13 9436/week @ 2024-07-20 9808/week @ 2024-07-27 9561/week @ 2024-08-03 11073/week @ 2024-08-10 11522/week @ 2024-08-17

44,120 每月下载次数
用于 63 个 crate (直接使用 36 个)

Zlib 许可证

225KB
5K SLoC

Rust 重写的 LodePNG

这是一个纯 Rust PNG 图像解码器和编码器。允许在不使用任何系统依赖项的情况下轻松读取和写入 PNG 文件。

要使用 lodepng crate,将以下内容添加到您的 Cargo.toml

[dependencies]
lodepng = "3.8"

有关详细信息,请参阅 API 参考。需要 Rust 1.64 或更高版本。

加载图像示例

examples/ 目录中有更多示例.

let image = lodepng::decode32_file("in.png")?;

返回类型为 lodepng::Bitmap<lodepng::RGBA<u8>> 的图像,具有 .width.height.buffer 字段(缓冲区是一个 Vec)。

RGB/RGBA 像素类型来自 RGB crate,您可以单独导入它以在整个程序中使用相同的像素结构,而无需转换。但如果您想将图像缓冲区作为一系列原始字节读取,忽略 RGB(A) 像素结构,则使用

[dependencies]
rgb = "0.8"
use rgb::*;let bytes: &[u8] = image.buffer.as_bytes();

保存图像示例

lodepng::encode32_file("out.png", &buffer, width, height)?

RGBA缓冲区可以是任何类型的切片,只要每个元素有4个字节(例如 struct RGBA[u8; 4])并且实现了 Pod 特性。

高级

let mut state = lodepng::Decoder::new();
state.remember_unknown_chunks(true);

match state.decode_file("in.png") {
    Ok(lodepng::Image::RGB(image)) => {}
    Ok(lodepng::Image::RGBA(image)) => {}
    Ok(lodepng::Image::RGBA16(image)) => {}
    Ok(lodepng::Image::Grey(image)) => {}
    Ok(_) => {}
    Err(err) => {}
}

for chunk in state.info_png().unknown_chunks(ChunkPosition::IHDR) {
    println!("{:?} = {:?}", chunk.name(), chunk.data());
}

// Color profile (to be used with e.g. LCMS2)
let icc_data = state.get_icc();

有关如何使用lodepng和色彩配置文件的示例,请参阅load_image 包。

从2.x升级

  • C FFI仍然存在,但由于结构体布局的变化,不再与原始C lodepng兼容。
  • 结构体使用bool代替0/1 int
  • 自定义zlib回调使用io::Write代替malloc分配的缓冲区(请记住使用write_all而不是write!)
  • ffi::Error已重命名为ffi::ErrorCode
  • 压缩级别通过set_level()函数设置,而不是单独的CompressConfig字段。

从1.x升级

  • CVec已替换为常规的Vec。删除编译器可能抱怨的额外.as_ref()
  • LCT_*常量已更改为ColorType::*
  • Chunk/Chunks已重命名为ChunkRef/ChunksIter
  • auto_convert是布尔值。
  • bitdepth有getter和setter。
  • 不再有C语言了!

这是一艘忒修斯之船

此代码库由Lode Vandevenne编写的C LodePNG派生而来。它已使用Citrus C to Rust转换器转换为Rust,然后进行了显著的重构,使其更符合Rust风格。因此,它现在是一个不同的库,其中包含一些原始API。

依赖项

~0.5–0.9MB
~15K SLoC