Проблема с моим приведенным выше кодом заключается в том, что я задаю кодеру неправильные размеры изображения в качестве параметров (256, 256).
Я ожидал, что размер изображения будет изменен до 256x256, но кодировщик ожидает текущие размеры изображения для правильной работы.
Следующий код работает, как ожидалось:
fn encode_png(&self, img: &DynamicImage) -> Result<(), Error> {
let file = File::create("icon.png").unwrap();
let ref mut buff = BufWriter::new(file);
let encoder = PNGEncoder::new(buff);
match encoder.encode(&img.to_bytes(), img.dimensions().0, img.dimensions().1, img.color()) {
Ok(_) => Ok(()),
Err(err) => Err(Error::new(err.description()))
}
}
Спасибо Solomon Ucko за указание на это в комментариях !
Поскольку мне нужно было изменить размер изображения, а затем закодировать его в файл PNG, я получил следующее:
fn encode_png(&self, img: &DynamicImage) -> Result<(), Error> {
if img.dimensions().0 != 256 {
let resized = img.resize_exact(256, 256, FilterType::Gaussian);
return self.encode_png(&resized);
}
let file = File::create("icon.png").unwrap();
let ref mut buff = BufWriter::new(file);
let encoder = PNGEncoder::new(buff);
match encoder.encode(&img.to_bytes(), img.dimensions().0, img.dimensions().1, img.color()) {
Ok(_) => Ok(()),
Err(err) => Err(Error::new(err.description()))
}
}