#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
: