如何在Rust中保存SubImage?解决write_to方法不存在错误
解决Rust中SubImage无法直接保存的问题
你遇到的这个报错很常见——SubImage本质上只是原图像的一个视图(view),它并没有自己独立存储像素数据,所以也就没有实现write_to方法。不用手动逐个像素读取到缓冲区,库本身就提供了便捷的转换方式,下面给你两种可行的解决办法:
方法一:将SubImage转为ImageBuffer后保存
SubImage提供了to_image()方法,可以把视图对应的像素数据复制出来,生成一个独立的ImageBuffer对象,而ImageBuffer是支持write_to方法的。修改你的代码如下:
use image::{imageops, ImageFormat}; use std::fs::File; fn main() { f(); } fn f(){ let (w,h)=(100,100); // 把图像打开移到循环外,避免重复读取文件,提升效率 let mut img = image::open("mySvg.png").unwrap(); for (x,y) in &[(100 as u32,200 as u32)]{ let subimg = imageops::crop(&mut img, *x , *y , w , h ); let mut output = File::create(format!("mySvg.{}.{}.png",x,y)).unwrap(); // 将SubImage转换为ImageBuffer,再调用write_to subimg.to_image().write_to(&mut output, ImageFormat::Png).unwrap(); } }
方法二:转为DynamicImage后保存
如果你习惯用DynamicImage的API,也可以把ImageBuffer再包装成DynamicImage,效果是一样的:
// 替换上面的write_to行 DynamicImage::ImageRgba8(subimg.to_image()).write_to(&mut output, ImageFormat::Png).unwrap();
为什么原来的代码会报错?
你收到的报错信息:
no method named
write_tofound for structSubImage<&mut DynamicImage>in the current scope
原因很简单:write_to是实现给拥有像素数据的类型(比如DynamicImage、ImageBuffer)的,而SubImage只是一个指向原图像某块区域的引用,没有自己的像素存储,自然没有这个方法。to_image()帮我们完成了从视图到独立图像数据的转换,这也是最简洁的方式。
内容的提问来源于stack exchange,提问作者skatori
相关产品推荐
相关产品推荐

