Rust: кодируйте изображение JPEG в PNG с помощью image-rs - PullRequest
1 голос
/ 26 мая 2020

Я использую ящик image ( Link to repo ) в Rust, чтобы закодировать изображение GIF в PNG со следующим кодом:

  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(), 256, 256, img.color()) {
      Ok(_) => Ok(()),
      Err(err) => Err(Error::new(err.description()))
    }
  }

The * Переменная 1007 * представляет собой DynamicImage, который я открыл с помощью метода open из того же ящика.

Происходит то, что программы запускаются успешно, но выходной файл поврежден. Я написал код на основе следующих документов: PNGEncoder | encode

Заранее спасибо!

1 Ответ

1 голос
/ 26 мая 2020

Проблема с моим приведенным выше кодом заключается в том, что я задаю кодеру неправильные размеры изображения в качестве параметров (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()))
    }
  }
...