2011-02-03 74 views
3

ランダムなビットマップデータを含む「ビットマップ」タイプがあります。私は、明るさ、色、彩度、および色相のための自分の調整を書いてきましたが、それぞれのビットに個別に作用し、驚くことではありません。ColorMatrixを.NETで使用して明るさ、色、彩度、色相を変更する方法

私の研究では、マトリックスを使用することでこれらを調整するのが非常に速くなることに気付きました。さらに、.NETには、DrawImage()で行列効果を適用できるColorMatrixがあります。

我々は(MSDNのWebサイトから)次のようなルックスを設定マトリックス:

float[][] colorMatrixElements = { 
new float[] {2, 0, 0, 0, 0},  // red scaling factor of 2 
new float[] {0, 1, 0, 0, 0},  // green scaling factor of 1 
new float[] {0, 0, 1, 0, 0},  // blue scaling factor of 1 
new float[] {0, 0, 0, 1, 0},  // alpha scaling factor of 1 
new float[] {.2f, .2f, .2f, 0, 1}}; // three translations of 0.2 

をしかし、私は、適切な範囲を見つけるか、またはこれらの番号のいずれかが実際に正確に何をすることができませんでした。私はどのように明るさ、色、彩度、色相を調整するのか分かりません。

私はどこかの良い文書を紛失していますか?

ありがとうございます!

+0

最後の行は「明るさ」です。現在、私はそれをすべて明るさに設定しています。 (0〜> 1の範囲) – DanTheMan

答えて

4

http://www.graficaobscura.com/matrix/index.htmlにいくつかの詳細がありますが、あなたの他のコードを投稿することができます。ピクセル単位での操作は非常に一般的です。この種の操作では通常、パフォーマンスの問題は発生しません。 .NETのBitmap.SetPixelは非常に遅いです。 codeprojectには、より速い方法を示す良いC# image processing seriesがあります。私はC++での経験はありませんが、私は見ていきます。

+0

参考になりました。私は、私が行列を使うことができると思っていた以上のことをしました。私ができなかった唯一の(必要な)ものが「コントラスト」でしたが、C#の例はそれを直しました。私はいくつかのテストを行いました。そして、はい、それはほとんどが遅い「SetPixel」でした。それを数千回実行すると、コードが遅くなりました! – DanTheMan

1

カラーマトリックスでできることには制限があります。

基本的に、提供するマトリックスは、実際には均質な4次元変換です。これは、色の異なるチャンネル(R G B A)を回転、拡大縮小、変換することを意味する大きな言葉です。

詳細はTransformation Matrixを参照してください。

+0

明るさはスケーリングに対応し、色相の変化は回転に対応します。彩度は原点から離れた点を基準にしたスケーリングに対応していると私は信じています。スケーリングとそれに続く翻訳で表現することもできます。 –

関連する問題