2017-09-04 3 views
0

私はこのプログラムを画像の明るさを調整する機能を追加するのにlinkと使います。このコードは問題ありませんが、明るさを調整するには時間がかかります(画像ファイルのサイズは1.8MB)。低品質の画像を試してみると、即座に画像(画像ファイルのサイズ100KB)が調整されます。画像の明るさを調整する効率的な方法はありますか?大きな画像の明るさ画像C#

+0

さらに低レベルのアプローチを使用して編集できます。 http://www.vcskicks.com/fast-image-processing.php – leAthlon

+0

大きな画像(100kB対1.8MB)と比較して、非常に小さい画像を扱うときは、常に違いがあります。では、この質問の解決策から何を期待していますか? – Fildor

+1

コードは、通常のビットマップでSetPixelを使用しているようです。これはスローが遅いので、これは悪い考えです。代わりにa)LockBitsまたはb)FastBitmapまたはc)ColorMatrixを使用してください!ここにたくさんの例があります。 – TaW

答えて

2

コードは、BitmapsGetPixelSetPixelを使用しているようです。それは遅いので、これは悪い考えです。

Bitmapの1つのピクセルを操作するには、ロックされている必要があります(Get/SetPixelは裏で行います)。ピクセル単位で行うことは、1000x1000サイズのイメージでは、ロック/実行されます。これは膨大なオーバーヘッドを生み出します。これを回避する

方法1

一つの方法は、LockBits機能でビットマップ全体をロックすることです。これで、ピクセルをループして変更することができます。この方法について

2つのノート:

  • 我々は今、アクセスそれは別に、各チャンネルで、各ピクセルの生のバイトは何をしている:BGRまたはBGRAのいずれか、ピクセルフォーマットに依存します。これは、チャンネルがであり、通常のRGB/ARGBフォーマットのColorメソッドから物理的に逆転されてであることを意味します。

  • 物理ビットマップピクセル行をループするには、各行にstrideを追加する必要があります。この場合、行は4バイトの倍数になります。またsee here

は、いくつかの例については、あなたはsome of these posts上で閲覧することもできます。柔軟な操作を可能にするためにデリゲートを使用する特にthis oneに注意してください。

(それらが画像を合成することを目指しているため、ポストのいくつかは、2つのあるいは3ロックビットマップを使用することに注意してください。)

方法二

ピクセルのいずれかをロックするオーバーヘッドを回避する別の方法1つは、自分自身を全体としてロックすることによって助けられる既製のビットマップクラスです。 Herehereは私が自分自身を試していない例です。

方法3

最後の両方ではなく、シンプルで本当に速いです画像操作のための非常にエレガントな方法があります。最高の結果を得るために専門的にも作られています:ColorMatrixを設定できます。

明るさ、ガンマ、色相を変更したり、一部を変更することができます。 Here is a very nice introduction

唯一の欠点は固定操作に限られているため、photoshop-type layer modesなどの他のファンシーなもののカスタムフィルタを作成することはできません。特に、隣接するピクセルを処理する必要があるフィルタなどがあります。ぼかしのために..

明るさの変更が必要な場合は、これをおすすめします。

関連する問題