Crates.io | lodepng |
lib.rs | lodepng |
version | 3.10.7 |
source | src |
created_at | 2015-01-21 21:33:58.154596 |
updated_at | 2024-09-05 12:58:41.300796 |
description | Reading and writing PNG files without system dependencies. Pure Rust port of LodePNG. |
homepage | https://lib.rs/crates/lodepng |
repository | https://github.com/kornelski/lodepng-rust.git |
max_upload_size | |
id | 848 |
size | 231,438 |
This is a pure Rust PNG image decoder and encoder. Allows easy reading and writing of PNG files without any system dependencies.
To use the lodepng crate, add to your Cargo.toml
:
[dependencies]
lodepng = "3.8"
See the API reference for details. Requires Rust 1.64 or later.
There are more examples in the examples/
dir.
let image = lodepng::decode32_file("in.png")?;
returns image of type lodepng::Bitmap<lodepng::RGBA<u8>>
with fields .width
, .height
, and .buffer
(the buffer is a Vec
).
The RGB/RGBA pixel types are from the RGB crate, which you can import separately to use the same pixel struct throughout the program, without casting. But if you want to read the image buffer as bunch of raw bytes, ignoring the RGB(A) pixel structure, use:
[dependencies]
rgb = "0.8"
use rgb::*;
…
let bytes: &[u8] = image.buffer.as_bytes();
lodepng::encode32_file("out.png", &buffer, width, height)?
The RGBA buffer can be a slice of any type, as long as it has 4 bytes per element (e.g. struct RGBA
or [u8; 4]
) and implements the Pod
trait.
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();
See load_image crate for an example how to use lodepng with color profiles.
bool
where appropriate instead of 0/1 int
.io::Write
instead of malloc
-ed buffers (remember to use write_all
, not write
!)ffi::Error
has been renamed to ffi::ErrorCode
.set_level()
function instead of individual CompressConfig
fields.CVec
has been replaced with a regular Vec
. Delete extra .as_ref()
that the compiler may complain about.LCT_*
constants have been changed to ColorType::*
.Chunk
/Chunks
renamed to ChunkRef
/ChunksIter
.auto_convert
is a boolean.bitdepth
has a getter/setter.This codebase has been derived from the C LodePNG by Lode Vandevenne. It has been converted to Rust using Citrus C to Rust converter, and then significanlty refactored to be more idiomatic Rust. As a result, it's now a different library, with some of the original API.