/// saves a buffer to a png with a width and a height (h) at a path pub fn save_png(buf: &[u16], w: u32, h: u32, path: &std::path::Path) -> Result<(), Box<dyn Error>> { let (max, min) = (*buf.iter().max().unwrap() as f64, *buf.iter().min().unwrap() as f64); println!("saving png: maximum pixel value {} {:?}", max, &path); let data: Vec<u8> = buf.iter().flat_map(|i| ((((*i as f64) / max) * 65530.0) as u16).to_be_bytes()).collect(); let buf_writer = &mut BufWriter::new(std::fs::File::create(path.with_extension("png"))?); let mut encoder = png::Encoder::new(buf_writer, w, h); encoder.set_color(png::ColorType::Grayscale); encoder.set_depth(png::BitDepth::Sixteen); let mut writer = encoder.write_header()?; writer.write_image_data(&data)?; Ok(()) }
时间: 2024-04-17 19:22:59 浏览: 156
这段代码是一个函数,用于将缓冲区保存为指定宽度和高度的 PNG 图像文件。
该函数的签名是 `pub fn save_png(buf: &[u16], w: u32, h: u32, path: &std::path::Path) -> Result<(), Box<dyn Error>>`,接受四个参数:
- `buf`:包含图像像素值的缓冲区,类型为 `&[u16]`。
- `w`:图像的宽度,类型为 `u32`。
- `h`:图像的高度,类型为 `u32`。
- `path`:保存 PNG 文件的路径,类型为 `&std::path::Path`。
函数的实现逻辑如下:
1. 通过迭代器方法求取缓冲区中的最大值和最小值,并将其转换为 `f64` 类型的最大值 `max` 和最小值 `min`。
2. 打印输出最大像素值和路径信息。
3. 创建一个空的 `Vec<u8>` 类型的变量 `data`。
4. 使用 `flat_map()` 方法遍历缓冲区中的每个像素值,并将其转换为 `[u8; 2]` 类型的大端序字节,并将结果添加到 `data` 中。
5. 创建一个 `BufWriter` 类型的变量 `buf_writer`,用于写入 PNG 文件。
6. 使用给定路径的文件名后缀为 `.png` 创建一个新的路径,并打开对应文件进行写入操作。
7. 创建一个 `png::Encoder` 对象 `encoder`,用于设置 PNG 文件的编码参数。
8. 设置编码器的颜色类型为灰度图像 (`Grayscale`) 和位深度为 16 位 (`BitDepth::Sixteen`)。
9. 调用 `encoder.write_header()` 方法,获取一个可写入图像数据的 `png::Writer` 对象 `writer`。
10. 调用 `writer.write_image_data()` 方法,将图像数据写入 PNG 文件。
11. 如果所有操作都成功完成,则返回 `Ok(())` 表示成功;否则,返回一个错误信息。
这段代码实现了将缓冲区的像素数据转换为 PNG 图像文件并保存的功能。
阅读全文
相关推荐



















