如何使用Piston的图像库更改图像颜色类型?

时间:2017-07-10 01:44:50

标签: rust

我的应用程序旨在使用RGB像素格式处理图像数据。我需要允许它拍摄所有编码的图像。我的第一个想法是在处理之前将图像转换为RGB格式:

extern crate image;

use std::ops;
use image::ConvertBuffer;

pub fn process_generic<P,C>(im: image::ImageBuffer<P,C>)
   where P: image::Pixel + 'static,
         P::Subpixel: 'static,
         C: ops::Deref<Target = [P::Subpixel]>
{
    let result: image::ImageBuffer<image::Rgb<u8>, Vec<u8>> = im.convert();
}

fn main() {}

编译这会给我一个错误

error[E0277]: the trait bound `image::Rgb<u8>: image::color::FromColor<P>` is not satisfied
  --> src/main.rs:12:66
   |
12 |     let result: image::ImageBuffer<image::Rgb<u8>, Vec<u8>> = im.convert();
   |                                                                  ^^^^^^^ the trait `image::color::FromColor<P>` is not implemented for `image::Rgb<u8>`
   |
   = help: consider adding a `where image::Rgb<u8>: image::color::FromColor<P>` bound
   = note: required because of the requirements on the impl of `image::ConvertBuffer<image::ImageBuffer<image::Rgb<u8>, std::vec::Vec<u8>>>` for `image::ImageBuffer<P, C>`

我无法添加绑定,因为模块image::color是私有的。我错过了什么吗?我也试图通过手动转换每个像素,但这似乎是一种更糟糕的方式。

1 个答案:

答案 0 :(得分:1)

您可以直接使用image::ConvertBuffer提供的特征限制:

extern crate image;

use image::ConvertBuffer;

pub fn process_generic<P, C>(im: image::ImageBuffer<P, C>)
where
    image::ImageBuffer<P, C>: image::ConvertBuffer<image::ImageBuffer<image::Rgb<u8>, Vec<u8>>>,
    P: image::Pixel + 'static,
{
    let _result = im.convert();
}

fn main() {}

虽然我建议为image::ImageBuffer<image::Rgb<u8>, Vec<u8>>和/或image::ImageBuffer<P, C>引入类型别名。