首页 > 解决方案 > 如何将 DynamicImage 转换为 ImageBuffer?

问题描述

当我运行以下代码时,最后一行会导致此错误:

error[E0308]: mismatched types
  --> src\main.rs:25:13
   |
25 |     box_filter(&img, 5, 5);
   |                ^^^^ expected struct `ImageBuffer`, found enum `DynamicImage`
   |
   = note: expected reference `&ImageBuffer<Luma<u8>, Vec<u8>>`
              found reference `&DynamicImage`
extern crate image;
extern crate imageproc;

use image::GenericImageView;
use imageproc::filter::box_filter;

fn main() {
    println!("Hello, world!");

    // Use the open function to load an image from a Path.
    // `open` returns a `DynamicImage` on success.
    // `unwrap` returns a `panic` when it receives a `None`.
    let img = image::open(
        "C:/Users/hp/Desktop/Multiprocessor real-time scheduling/Project2/data/aLIEz.jpg",
    )
    .unwrap();

    // The dimensions method returns the images width and height.
    println!("dimensions {:?}", img.dimensions());

    // The color method returns the image's `ColorType`.
    println!("{:?}", img.color());

    // Write the contents of this image to the Writer in PNG format.
    img.save(
        "C:/Users/hp/Desktop/Multiprocessor real-time scheduling/Project2/data_output/test.png",
    )
    .unwrap();

    box_filter(&img, 5, 5);
}

我不知道如何将 a 转换DynamicImage为 anImageBuffer以便我可以应用过滤器。我已经看过image 0.23.12依赖的文档,但我不明白该怎么做。

标签: imagetypesrust

解决方案


这个更新的示例应该可以工作:

extern crate image;
extern crate imageproc;
use image::GenericImageView;
use imageproc::filter::box_filter;

fn main() {
    let dynamic_image = image::open("path/here").unwrap();
    let gray_image = dynamic_image.to_luma8();
    let result = box_filter(&gray_image, 5, 5);
}

如果您需要image::RgbImageorimage::RgbaImage然后调用into_rgb8()or into_rgba8()。不过box_filter()只支持image::GrayImage.


推荐阅读