如何解决Rust中使用image库写入图像的失真问题?
解决image crate写入图像失真(彩虹色/灰色阴影)问题
你的图像失真问题根源很明确:JPEG格式不支持Alpha通道,但代码里读取图像后转成了RGBA四通道格式,保存JPEG时通道数不匹配,导致色彩解析错乱,出现彩虹色和灰色阴影。
下面是两种可行的解决办法:
方案1:转成RGB格式后保存JPEG
如果不需要透明通道,把图像转成RGB三通道格式再保存,完全适配JPEG的要求:
修改read_photo函数,替换成RGB8转换:
fn read_photo(file_path: &str) -> ImageResult<(u32, u32, Vec<u8>)> { let img = open(file_path)?; let (width, height) = img.dimensions(); // 转成RGB8格式,移除Alpha通道 let pixels = img.to_rgb8().into_raw(); println!("read image"); Ok((width, height, pixels)) }
同时更新write_photo函数,用RgbImage构建图像:
fn write_photo( file_path: &str, width: u32, height: u32, pixels: &[u8], ) -> Result<(), image::ImageError> { let img = image::RgbImage::from_raw(width, height, pixels.to_vec()).ok_or( image::ImageError::Parameter(image::error::ParameterError::from_kind( image::error::ParameterErrorKind::DimensionMismatch, )), ); img?.save(file_path)?; println!("write image"); Ok(()) }
方案2:保存为PNG格式保留Alpha通道
如果需要保留透明信息,直接把输出文件后缀改成.png即可,无需修改核心逻辑:
fn main() { let path = "src/assets/test.jpeg"; // 输出改为PNG格式 let output = "src/assets/check.png"; let (w, h, p) = read_photo(path).expect("Error"); let _ = write_photo(output, w, h, &p).unwrap(); }
这样RGBA四通道数据会被PNG正确解析,不会出现色彩失真。
内容的提问来源于stack exchange,提问作者Dessxvii
相关产品推荐
相关产品推荐

