2017-07-10 3 views
2

RGBピクセル形式を使用して画像データを扱うアプリケーションがあります。私はそれがすべてのエンコーディングのイメージを取ることを許可する必要があります。私の最初のアイデアは、処理前のRGBフォーマットに画像を変換することでした:Piston's image libを使用して画像の色の種類を変更するには?

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

あなたが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>のためにタイプエイリアスを導入するお勧めしますが。

+1

ああ、ありがとう!私が通常使っているエイリアス "RgbImage"がありますが、明示的に述べると便利だと思いました。しかし、ImageBufferを別名にする方法がわかりません私の関数に 'where'句が必要なので(私は'型定義に 'trait constraintsを適用し続けます') – CT075

+0

質問に完全な例を含めて間違いなく正しいことです。 'image :: ImageBuffer 'のためにできることはあまりありません。実際には、「イメージ」を2回書くのを避けるために、それを完全にインポートしたいと思うかもしれません。 – Shepmaster

関連する問題