2016-06-01 5 views
0

ピクセルの束を計算し、QtConcurrent::mappedReducedを使ってQImageに入れたいと思います。しかし、私はQImage::setPixel: coordinate (636,442) out of rangeエラーを取得します。これはおそらく、nullイメージを作成するデフォルトのQImageコンストラクタを使用しているためです。ドキュメンテーションでコンストラクタの引数を設定する方法や、縮小の初期値を提供する方法を見つけられませんでした。これを行う方法はありますか? JSのように初期値を指定する必要があると思っていましたが、Qtはおそらく別のアイデアを持っていました。QtConcurrentを初期値で減らす

スケルトン:私は回避策を見つけた...しかし、今私は、チェック減速を実行するたびに確認する必要があるため、このコードは...最適ではない

struct Pixel{ 
    QRgb value; 
    QPoint pos; 
}; 

void reducer(QImage &result, const Pixel &pixel){ 
    result.setPixel(pixel.pos,pixel.value); 
} 

...

void reducer(QImage &result, const Pixel &pixel, int width, int height){ 
    if(result.width()==0) 
     result = QImage(width,height, QImage::Format_RGB888); 
    result.setPixel(pixel.pos,pixel.value); 
} 
... 
auto boundReducer = std::bind(reducer,_1,_2,width,height); 

答えて

0

このチェックは非常に安いですが、あなたのレデューサーはほとんど仕事をしないので、何があってもパフォーマンスの問題が発生します。

これを少しきれいにするには、画像がデフォルトで構築されているかどうか、つまりnullであるかどうかを確認し、幅/高さを渡すのではなく、意図した初期画像をパラメータとして渡します。

void reducer(QImage &result, const Pixel &pixel, const QImage& initial) { 
    if (result.isNull()) 
     result = initial; 
    result.setPixel(pixel.pos,pixel.value); 
} 

auto boundReducer = std::bind(reducer, _1, _2, 
           QImage(width,height,QImage::Format_RGB888)); 

またQImageから派生し、デフォルト・構築するためにどのように自分自身を知っているクラスを使用することができますが、そのようなクラスに実行時の変数の引数を渡すためには、静的メンバ変数の使用を必要とします。だから、それはあまりにも多くのハックだと思う。

+0

ありがとうございます:ああ...あらかじめ構築された画像を渡すのは意味がありますが、減速器の単純さのためにパフォーマンス上の問題が生じると思われるのはなぜですか? – petoknm

+0

@petoknm 'setPixel'オペレーションは、' pixel'コンテナを繰り返し、処理するためにピクセルをスレッドプールに送出するオーバーヘッドよりもはるかに時間がかかりません。 'setPixel'はメモリへの32ビットの書き込み操作です。それを並列化することには意味がありませんが、できるだけ速く実行できるのは完全なメモリ帯域幅であるからです。この動作は、制約されたメモリ帯域幅、換言すれば、である。 I/O制約は並列化では得られません。 y、xに沿ってピクセルコンテナを並べ替えることができますし、繰り返してRAMの速度になります。 –

+0

説明をありがとう – petoknm

関連する問題