BorderTypeプロパティ、InterpolationModeプロパティのページでも少し紹介していますが、画像の輝度値を取得/設定するには
var img = new ImagingSolution.Imaging.ImageData("image.bmp");
// 輝度値の取得
var bright = img[2, 3];
// 輝度値の設定
img[2, 3] = 234;
のようにImageDataクラスオブジェクトを、あたかも配列として値の取得/設定ができるようになっています。
また、画像の輝度値の値は通常8bit(0~255)なので、
img[2, 3] = -45; や img[4, 5] = 258;
のようには設定できないのですが、上記のように設定すると、クラス内部的には
img[2, 3] = -45; → img[2, 3] = 0;
img[4, 5] = 258; → img[4, 5] = 255;
として設定されるので、輝度値を設定するときに、if文で0~255の範囲チェックは必要ありません。
また、 img[2, 3] = -45; と設定した場合ですが、MinusValueModeプロパティを使って
img.MinusValueMode = ImagingSolution.Imaging.ImageData.MinusValueModeEnum.Absolute; |
のように設定すると img[2, 3] = -45; は img[2, 3] = 45; として設定されます。
MinusValueModeプロパティは何も設定しないとMinusValueModeEnum.Zeroに設定されています。
値の取得/設定にはC#のインデクサという機能を用いているのですが、このインデクサに下記4つのオーバーロードを用意しています。
int this[int row, int column] // 取得/設定
int this[int row, int column, int ch] // 取得/設定
int this[float row, float column] // 取得のみ
int this[float row, float column, int ch] // 取得のみ
この引数の部分の並びを[row, column]とするか、[column, row]にするか悩んだのですが、画像データを多次元配列で表したときに同じ並びになる[row, column]の順番なので、ご注意ください。
座標っぽく表示すると[y, x]という順番です。
row(行番号)とcolumn(列番号)の位置関係ですが、画像の左上を原点[0, 0]として、モノクロ画像(8bit,1channel)の場合、次のようになります。
カラー画像(24bit,3channel)の場合、
this[int row, int column]
の形式で輝度値を参照すると、下図のようになります。
これだと、少し分かりづらいので、chの引数を用いて
this[int row, int column, int ch]
の形式で参照すると、下図のようになります。
カラー画像(32bit,4channel)は、下図のようになります。
ピンバック: 【C#】ImageDataクラスライブラリ公開 | イメージングソリューション
ピンバック: ImageDataクラスライブラリ | イメージングソリューション