5

これは一般的にグラフィックス操作の質問だと思いますが、Qt (c++) でこれを達成したいと思います。私がイメージを持っている場合-透明な背景に円を言ってみましょう-ライトグレーの色の場合、色相/彩度をシフトして色を付ける機能がQtに組み込まれていますか?

ピクセルごとに移動し、rgb を数学的に変更することができると思います-x を r、g、および b に追加して、目的の色を取得しますが、すべてのピクセルを変更するよりも良い方法があるはずです。

Qt ドキュメントには、アルファと色を変更するだけで、ここまで画像操作を行うものはありません。オープンソース ライブラリを調べる必要がありますか (最終的には独立して販売されるソフトウェアになる可能性があります)。もしそうなら、何か推奨事項はありますか?それとも、外部ライブラリや狂ったアルゴリズムを必要とせずに達成できる秘密の関数が Qt ドキュメントに隠されていますか?

4

4 に答える 4

6

考えられる行動方針:

  1. 画像をQImageとしてロードします
  2. QImage QImage::convertToFormat(QImage::Format_Indexed8)カラーテーブルを使用してインデックス付きの画像を取得するには、
  3. カラーテーブルの値を取得するQRgb QImage::color ( int i ) const
  4. QColor ( QRgb color )および他のQColorメソッドを使用して色を操作します
  5. カラーテーブルを次のように変更しますvoid QImage::setColor ( int index, QRgb colorValue )
于 2012-03-30T08:39:20.513 に答える
2

残念ながら、いくつかのオプションがありますが、いずれも組み込みの Qt ソリューションではありません。

  1. SSE/SSE2 を利用するには、OpenMP またはその他の同時実行ライブラリを使用します。
  2. OpenGL、DirectX、またはさまざまな GPGPU プログラミング手法を介して GPU を使用します。
  3. (私が選んだ解決策) OpenCLを使用して、シェーダー プログラミングの「楽しさ」をまったく使わずに、CPU と GPU の両方の同時実行性を利用します。
  4. スレッド ワーカーのプールを生成し、それぞれにイメージのチャンクを処理させます。

私のアプリケーションは多くの画像フィルタリングを行っており、フィルターを OpenCL に移植した後のパフォーマンスの向上には正直ショックを受けました。

1936×2592 の明るさ変更フィルタは、QImage 内の各ピクセルを反復するネイティブ C++ コードで 175 ミリ秒で実行されました。

OpenCL への移植後、15 ミリ秒まで低下しました。もちろん、データを QImage から取り出して再挿入する必要がありましたが、そのオーバーヘッドは OpenCL のパフォーマンスの向上に比べればたいしたことありません。

コーディングの冒険を頑張ってください!

于 2012-06-09T01:16:50.160 に答える