как сохранить субизображение в Rust?

#rust

#Ржавчина

Вопрос:

Я получил субизображение из изображения в Rust. Хотя в документе, похоже, не указано никакого способа удобного сохранения субизображения. Должен ли я считывать каждый пиксель для записи в буфер?

Здесь следует мой код в Playground.

 fn main() {
    
    f();
}
fn f(){
let (w,h)=(100,100);
for (x,y) in amp;[(100 as u32,200 as u32)]{
         let mut img = image::open("mySvg.png").unwrap();
         let subimg = imageops::crop(amp;mut img, *x , *y , w , h );
         let mut output = std::fs::File::create(format!("mySvg.{}.{}.png",x,y).as_str()).unwrap();
         subimg.write_to(amp;mut output, ImageFormat::Png).unwrap(); //Error!!
}}
 
  no method named `write_to` found for struct `SubImage<amp;mut DynamicImage>` in the current scope
  --> src/main.rs:12:17
   |
12 |          subimg.write_to(amp;mut output, ImageFormat::Png).unwrap(); //Error!!
   |                 ^^^^^^^^ method not found in `SubImage<amp;mut DynamicImage>`
 

Ответ №1:

Метод write_to не реализован для SubImage .

Однако SubImage::to_image доступен метод, который возвращает ImageBuffer .

Затем можно использовать ImageBuffer::save_with_format для записи файла.

Я использовал изображение Ferris и следующую структуру каталогов:

 .  stackoverflow_save_subimage
├─ Cargo.lock
├─ Cargo.toml
├─ ferris.png
├─ src/
│  └─ main.rs
└─ target/
 
 use image::*;

fn main() {
    let (w, h) = (100, 100);

    for amp;(x, y) in amp;[(100, 200)] {
        let mut img = image::open("ferris.png").unwrap();
        let sub_img = imageops::crop(amp;mut img, x, y, w, h);
        let path = format!("ferris_crop.{}.{}.png", x, y);
        sub_img
            .to_image()
            .save_with_format(amp;path, ImageFormat::Png)
            .unwrap();
    }
}
 

Выполнение приведенного выше генерирует следующие обрезанные ferris_crop.100.200.png :

Обрезанный вывод ferris.png