Rust中实现GenericImageView的自定义BitmapImageSlice转PNG的方法
你可以直接用 Rust 的 image 库提供的 PNG 编码能力完成转换,步骤如下:
首先在 Cargo.toml 中引入依赖:
[dependencies] image = { version = "0.24", features = ["png"] }
方案1:直接保存为本地PNG文件
实现代码如下:
use image::{DynamicImage, ImageOutputFormat, GenericImageView}; use std::fs::File; use std::io::BufWriter; fn save_bitmap_to_png(slice: &BitmapImageSlice, output_path: &str) -> Result<(), Box<dyn std::error::Error>> { // 从自定义的BitmapImageSlice生成标准的RGB图像缓冲区 let rgb_image = image::ImageBuffer::from_fn( slice.dimensions().0, slice.dimensions().1, |x, y| slice.get_pixel(x, y) ); let dynamic_img = DynamicImage::ImageRgb8(rgb_image); // 创建写入流并编码为PNG let file = File::create(output_path)?; let mut writer = BufWriter::new(file); dynamic_img.write_to(&mut writer, ImageOutputFormat::Png)?; Ok(()) }
调用时直接传入你的BitmapImageSlice实例和输出路径即可。
方案2:获取PNG编码后的字节流
如果不需要落地到文件,只需要在内存中拿到PNG的二进制数据,可以用以下实现:
use image::{DynamicImage, ImageOutputFormat, GenericImageView}; use std::io::Cursor; fn bitmap_to_png_bytes(slice: &BitmapImageSlice) -> Result<Vec<u8>, Box<dyn std::error::Error>> { let rgb_image = image::ImageBuffer::from_fn( slice.dimensions().0, slice.dimensions().1, |x, y| slice.get_pixel(x, y) ); let dynamic_img = DynamicImage::ImageRgb8(rgb_image); let mut buf = Cursor::new(Vec::new()); dynamic_img.write_to(&mut buf, ImageOutputFormat::Png)?; Ok(buf.into_inner()) }
如果生成的PNG图案显示异常,可以优先检查你get_pixel方法中的位偏移计算逻辑,确认坐标x、y和buffer的对应关系是否符合你的位图存储规则。
内容的提问来源于stack exchange,提问作者user17014151
相关产品推荐
相关产品推荐

