ベクトルB=(1,1,1)として
各ピクセルの色をt*OBであらわされる直線からの距離に応じて、色を塗り替えるプログラム。
計算後、点の位置がRGB空間をはみ出してしまいます。
これを改善するためにRGB空間囲む6枚の平面が移動前と移動後の点に挟まるなら、平面上に色がとどまるように変更したいんだけど、少し計算処理を組み込むのがめんどくさいのでとまっています。
これが仕事なら真面目に作るんだけど仕事でもないのでとめています。
実は変数を少し弄ると、格段にフィルタの処理結果が良くなりますが、これはまだ模索中です。
public Bitmap lineFilter(Bitmap pictIn)
{
//テンプレ
Color C1;
this.h = pictIn.Height;
this.w = pictIn.Width;
double r1;
double r2;
double [] vecOB = {1,1,1};
double [] vecOH = {0, 0, 0};
double [] vecOA = {0, 0, 0};
double [] vecHA = {0, 0, 0};
double [] vecOA2 = { 0, 0, 0 };
double LenOH, LenOB,LenHA=0;
double a = -1.0;
double b = 2.0;
LenOB=Math.Sqrt(vecOB[0]* vecOB[0]+vecOB[1]* vecOB[1]+vecOB[2]* vecOB[2]);
pictOut = new Bitmap(this.w, this.h);
for (int i = 0; i < this.w; i++)
{
for (int j = 0; j < this.h; j++)
{
LenHA = 0;
C1 = pictIn.GetPixel(i, j);
vecOA[0] = C1.R;
vecOA[1] = C1.G;
vecOA[2] = C1.B;
LenOH =(vecOA[0] *vecOB[0]+vecOA[1] *vecOB[1]+vecOA[2] *vecOB[2]) /LenOB ;
for (int k = 0; k < 3; k++)
{
vecOH[k] = LenOH / LenOB * vecOB[k];
vecHA[k] = -vecOH[k] + vecOA[k];
LenHA += vecHA[k] * vecHA[k];
}
LenHA = Math.Sqrt(LenHA );
r1 = LenHA / 255.0;
r2 = a * r1 + b;
for (int k = 0; k < 3; k++)
{
vecOA2[k] = cutNum(0,255,(int)( r2 * vecHA[k] + vecOH[k]));
}
pictOut.SetPixel(i, j,
Color.FromArgb(
(int)vecOA2[0],
(int)vecOA2[1],
(int)vecOA2[2] ));
}
}
return pictOut;
}
最終更新:2010年05月30日 21:30