File: change-png-info.rs

package info (click to toggle)
chromium 135.0.7049.95-1~deb12u1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 5,959,392 kB
  • sloc: cpp: 34,198,526; ansic: 7,100,035; javascript: 3,985,800; python: 1,395,489; asm: 896,754; xml: 722,891; pascal: 180,504; sh: 94,909; perl: 88,388; objc: 79,739; sql: 53,020; cs: 41,358; fortran: 24,137; makefile: 22,501; php: 13,699; tcl: 10,142; yacc: 8,822; ruby: 7,350; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; awk: 197; sed: 36
file content (52 lines) | stat: -rw-r--r-- 1,881 bytes parent folder | download | duplicates (7)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
/// Tests "editing"/re-encoding of an image:
/// decoding, editing, re-encoding
use std::fs::File;
use std::io::BufWriter;
use std::path::Path;
pub type BoxResult<T> = Result<T, Box<dyn std::error::Error + Send + Sync>>;

fn main() -> BoxResult<()> {
    // # Decode
    // Read test image from pngsuite
    let path_in = Path::new(r"./tests/pngsuite/basi0g01.png");
    // The decoder is a build for reader and can be used to set various decoding options
    // via `Transformations`. The default output transformation is `Transformations::IDENTITY`.
    let decoder = png::Decoder::new(File::open(path_in)?);
    let mut reader = decoder.read_info()?;
    // Allocate the output buffer.
    let png_info = reader.info();
    let mut buf = vec![0; reader.output_buffer_size()];
    dbg!(png_info);

    // # Encode
    let path_out = Path::new(r"./target/test_modified.png");
    let file = File::create(path_out)?;
    let ref mut w = BufWriter::new(file);

    // Get defaults for interlaced parameter.
    let mut info_out = png_info.clone();
    let info_default = png::Info::default();

    // Edit previous info
    info_out.interlaced = info_default.interlaced;
    let mut encoder = png::Encoder::with_info(w, info_out)?;
    encoder.set_depth(png_info.bit_depth);

    // Edit some attribute
    encoder.add_text_chunk(
        "Testing tEXt".to_string(),
        "This is a tEXt chunk that will appear before the IDAT chunks.".to_string(),
    )?;

    // Save picture with changed info
    let mut writer = encoder.write_header()?;
    let mut counter = 0u8;
    while let Ok(info) = reader.next_frame(&mut buf) {
        let bytes = &buf[..info.buffer_size()];
        println!("{} {}", info.buffer_size(), reader.output_buffer_size());
        writer.write_image_data(&bytes)?;
        counter += 1;
        println!("Written frame: {}", counter);
    }
    Ok(())
}