第27回 画像の明るさ調整

公開日:2019-02-26

1. 概要

画像ビューアーで、明るさの調整が行えるようにしました。
また、機能的には使えるようになっていませんが、
動画では、白黒、セピア、ネガポジ反転、ぼかしなどの画像加工方法についても説明しています。

2. 動画


3. 説明

1. 画像の明るさの変更方法

画像(Bitmap)から1ピクセルずつ色を取得して、各要素(RGB)の値を増やして画像に戻すと、画像が明るくなります。 逆に、色を減らしていくと、画像が暗くなります。

画像の色の取得には Bitmap.GetPixel()、色の設定には Bitmap.SetPixel() で行うことができますが、かなり重いため、 今回は画像のメモリに直接アクセスして、取得と設定を行っています。

画像のメモリにアクセスするには、Bitmap.LockBits() を使います。
戻り値の BitmapData から画像の先頭アドレスが取得できるので、あとはポインターを使ってアクセスできます。
ポインターを使う時は、unsafe { } の中に処理を書く必要があります。
また、プロジェクトのプロパティのビルドにある、「アンセーフ コードの許可」にチェックを入れる必要があります。

2. 画像を白黒にする

RGB の各値を合算して 3 で割り平均値を出します。
あとは平均値を RGB の各値に設定すると、白黒になります。

3. 画像をセピア調にする

画像を1度白黒にして、茶色の RGB の比率になるような係数をかけると、セピア調になります。
ソースでは、B * 0.6、G * 0.8、R * 1 にしています。

4. 画像をネガポジ反転にする

RGB の各値に対して、0xff との排他的論理和(^) の値を色として設定すると、ネガポジ反転になります。

排他的論理和は2進数で計算を行い、値が同じ場合は 0、異なる場合は 1 となります。
0 ^ 0 = 0
0 ^ 1 = 1
1 ^ 0 = 1
1 ^ 1 = 0

桁数が増えても同じです。
00001111 ^ 11111111(0xff) = 11110000

片方に全て 1 を指定すると、値が反転します。
これを RGB の各値に対して行うと、ネガポジ反転になります。

5. 画像をぼかす

対象ピクセルの周辺にある RGB の各値の平均値を設定すると、ぼけたようになります。
また、単純な平均値を使うのではなく、周辺の値に重みを付けて計算するガウシアンぼかしと言う方法もあります。

4. 画面










ダウンロード

ver実行ファイルソース
1.1.11
2019/02/26
ncm_1_1_11.zipncm_1_1_11_src.zip