*2010/9/22 ソーマキューブというパズルの問題。 7つのピースを使ってこの形を作れるかな。 十字架。 &ref(十字架.png) 犬 &ref(ソーマキューブ犬.png) もう少し犬っぽい形があるような気がする。 *2010/9/30 &ref(水彩画風フィルタ失敗作.jpg) 水彩画風フィルタの失敗作 ソースコードは下記。 C#。 フォームにボタンを3つ、ピクチャボックスを2つ置いて使用。 配置したボタンのボタン2とボタン3で画像をピクチャボックスに表示してから、実行。 単なる試作品の上に失敗作。 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Threading; using System.Drawing; public delegate void ExampleCallback(Bitmap outBit, PictureBox p1); namespace WindowsFormsApplication2 { public partial class Form1 : Form { int tc = 0; //Bitmap lastB; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { pictureBox2.Image = Image.FromFile("D:/色々/中高生向け戦争小説 ギガンダム討伐/tumblr_l0771pDcX01qbq8jdo1_500.jpg"); } private void button1_Click(object sender, EventArgs e) { Bitmap b2 = new Bitmap(pictureBox1.Image); Bitmap b1 = new Bitmap (pictureBox1.Image); pictFilter PTC1 = new WindowsFormsApplication2.pictFilter(); //pictureBox1.Image=PTC1.HSVColorRound(b1, 30); //pictureBox2.Image =PTC1.Laplacian2(b1, PTC1.Laplacian(3, PTC1.GrayImage(b1))); pictureBox2.Image = PTC1.Laplacian(3, PTC1.GrayImage(b2)); pictureBox2.Image = PTC1.Laplacian2 (b1,b2) ; } public static void ResultCallback(Bitmap outBit, PictureBox p1) { p1.Image = outBit; } private void pictureBox1_Click(object sender, EventArgs e) { tc++; pictureBox1.Top = 0; pictureBox1.Left = 0; } private void button2_Click(object sender, EventArgs e) { OpenFileDialog ofd = new OpenFileDialog(); ofd.Filter = "画像ファイル(*.jpeg;*.jpg;*.gif)|*.jpeg;*.jpg;*.gif|すべてのファイル(*.*)|*.*"; if (ofd.ShowDialog() == DialogResult.OK) { pictureBox2.Image = Image.FromFile(ofd.FileName); } } private void button3_Click(object sender, EventArgs e) { OpenFileDialog ofd = new OpenFileDialog(); ofd.Filter = "画像ファイル(*.jpeg;*.jpg;*.gif)|*.jpeg;*.jpg;*.gif|すべてのファイル(*.*)|*.*"; if (ofd.ShowDialog() == DialogResult.OK) { pictureBox1.Image = Image.FromFile(ofd.FileName); } } } class pictFilter { public Bitmap HSVColorRound(Bitmap b1, int r) { Color C1; String s; Bitmap b2 = new Bitmap(b1.Width, b1.Height); HSV HSV1; double d; double MaxS=0; double d2=0; for (int i = 0; i < b1.Width; i++) { for (int j = 0; j < b1.Height; j++) { C1 = b1.GetPixel(i, j); HSV1 = HSVConvert.RGB2HSV(C1); //d = (double)(HSV1.H + r) / 360.0; //HSV1.H =(int) Math.Round (d*(1-d)*4.0*360.0) % 360; //HSV1.H =( HSV1.H +r) % 360; HSV1.H = (HSV1.H + r) % 360; //d2=HSV1.S/255.0; //HSV1.S = (int)Math.Floor(d2 * (1.0 - d2) * 4.0 * 255.0); //HSV1.S /= 2; //s = HSV1.ToString(); b2.SetPixel(i, j, HSVConvert.HSV2RGB(HSV1.H, HSV1.S, HSV1.V)); } } return b2; } public Bitmap Laplacian2(Bitmap bBitmap,Bitmap b2) { int i, j; double count; int tempR; int tempG; int tempB; double tempR2, tempG2, tempB2; double tempRGB; Color C1, C2,C3; Bitmap b3=new Bitmap (bBitmap.Width ,bBitmap.Height); // 変数の宣言 iFilter : ラプラシアンフィルタ // 画像に対するフィルタ処理 int size=4; int size2 = (2 * size + 1) * (2 * size + 1); double hiritu; double a; for (i = size; i < b2.Width - size; i++) { for (j = size; j < b2.Height - size; j++) { count = 0; for (int k = -size; k < size+1; k++) { for (int l = -size; l < size+1; l++) { tempR = b2.GetPixel(i + k, j + l).R; if (tempR > 128) { count++; } } } /* a= (size2 - count) / (size2 * (size2 - 1)); tempR2 =tempG2 =tempB2 = 0; hiritu = count / size2; double b=a*(size2-1) + hiritu; for (int k = -size; k < size+1; k++) { for (int l = -size; l < size+1; l++) { C3 = bBitmap.GetPixel(i + k, j + l); if (k == 0 && l == 0) { tempR2 += (double)C3.R * hiritu ; tempG2 += (double)C3.G * hiritu ; tempB2 += (double)C3.B * hiritu; } else { tempR2 += (double)C3.R * a; tempG2 += (double)C3.G * a; tempB2 += (double)C3.B * a; } } } tempR =(int)Math.Floor ( tempR2); tempG =(int) Math.Floor(tempG2); tempB = (int)Math.Floor(tempB2); C3 = Color.FromArgb(tempR, tempG, tempB); b3.SetPixel(i, j, C3); */ tempRGB=Math.Pow ((count) / ((2*size+1)*(2*size+1)),2); // フィルタ処理 C1 = bBitmap.GetPixel(i, j); C2 = b2.GetPixel(i, j); tempR = (int)(Math.Floor(CutNum((double)C1.R * (1 - tempRGB ) + (double)255 * tempRGB))); tempG = (int)(Math.Floor(CutNum((double)C1.G * (1 - tempRGB ) + (double)255 * tempRGB))); tempB = (int)(Math.Floor(CutNum((double)C1.B * (1 - tempRGB ) + (double)255 * tempRGB))); C3=Color.FromArgb(tempR, tempG, tempB); b3.SetPixel(i, j, C3); } } // フィルタ処理の結果の出力 return b3; //pictureBox1.Image = bBitmap; // 変更結果の設定 } private double CutNum(double x){ if (x > 255) { x = 255; } if (x < 0) { x = 0; } return x; } public Bitmap Laplacian(int iAmp,Bitmap bBitmap) { int i, j, iColorValue; // 変数の宣言 iColorValue : RGB平均値 // 変数の宣言 iFilter : ラプラシアンフィルタ int[] iFilter = new int[]{-1, -1, -1, -1, 8, -1, -1, -1, -1}; // 変数の宣言 iArrayValue : ピクセル色情報の配列 int[,] iArrayValue = new int[bBitmap.Width, bBitmap.Height]; Color[] cArrayColor = new Color[9]; // 変数の宣言 cArrayColor : 色情報の配列 Color cSetColor; // 変数の宣言 cSetColor : 設定する色 // 画像に対するフィルタ処理 for(i = 1; i < bBitmap.Width - 1; i++) for(j = 1; j < bBitmap.Height - 1; j++) { for(int k=-1;k<2;k++){ for(int l=-1;l<2;l++){ cArrayColor[(k + 1) * 3 + l + 1] = bBitmap.GetPixel(i+k,j+l); } } // フィルタ処理 iColorValue = iFilter[0]*cArrayColor[0].R + iFilter[1]*cArrayColor[1].R + iFilter[2]*cArrayColor[2].R + iFilter[3]*cArrayColor[3].R + iFilter[4]*cArrayColor[4].R + iFilter[5]*cArrayColor[5].R + iFilter[6]*cArrayColor[6].R + iFilter[7]*cArrayColor[7].R + iFilter[8]*cArrayColor[8].R; iColorValue = iAmp*iColorValue; // 出力レベルの設定 // iColorValue が負の場合 if(iColorValue < 0) iColorValue = -iColorValue; // 正の値に変換 // iColorValueが255より大きい場合 if(iColorValue > 255) iColorValue = 255; // iColorValue を 255 に設定 iArrayValue[i, j] = iColorValue;// iColorValue の設定 } // フィルタ処理の結果の出力 for (i = 1; i < bBitmap.Width - 1; i++) for (j = 1; j < bBitmap.Height - 1; j++) { // iArrayValue 値による色の設定 cSetColor = Color.FromArgb(iArrayValue[i, j], iArrayValue[i, j],iArrayValue[i, j]); // ピクセルの色の設定 bBitmap.SetPixel(i, j, cSetColor); } return bBitmap; //pictureBox1.Image = bBitmap; // 変更結果の設定 } public Bitmap GrayImage (Bitmap bBitmap) { int iRed, iBlue, iGreen; int iAverage; Color cSetColor; Color cColor; // 画像のグレースケールへの変換 for (int i = 0; i < bBitmap.Width; i++) for (int j = 0; j < bBitmap.Height; j++) { cColor = bBitmap.GetPixel(i, j); // ピクセルの色の取得 iRed = cColor.R; // Red 値の設定 iBlue = cColor.B; // Blue 値の設定 iGreen = cColor.G; // Green 値の設定 iAverage = (iRed + iBlue + iGreen) / 3;// RGB の平均値を算出 // iAverage 値による色の設定 cSetColor = Color.FromArgb(iAverage, iAverage, iAverage); bBitmap.SetPixel(i, j, cSetColor); // ピクセルの色の設定 } return bBitmap; //pictureBox1.Image = bBitmap; // 変更結果の設定 } struct HSV { public int H; public int S; public int V; } class HSVConvert { //RGBをHSVに変換 public static HSV RGB2HSV(Color RGB) { HSV hsv = new HSV(); double max = Math.Max(Math.Max(RGB.R, RGB.G), RGB.B); double min = Math.Min(Math.Min(RGB.R, RGB.G), RGB.B); //Vを求める hsv.V = (int)max; //RGBすべてが同じ場合 HとSは0 if (max == min) { hsv.H = 0; hsv.S = 0; } else { //Sを求める hsv.S = (int)(((max - min) * 255) / max); //Hを求める hsv.H = 0; if (max == RGB.R) { hsv.H = (int)(60 * (RGB.G - RGB.B) / (max - min)); if (hsv.H < 0) hsv.H += 360; } else if (max == RGB.G) { hsv.H = (int)(60 * (2 + (RGB.B - RGB.R) / (max - min))); if (hsv.H < 0) hsv.H += 360; } else if (max == RGB.B) { hsv.H = (int)(60 * (4 + (RGB.R - RGB.G) / (max - min))); if (hsv.H < 0) hsv.H += 360; } } return hsv; } //HSVをRGBに変換 public static Color HSV2RGB(int H, int S, int V) { if (H == 360) H = 0; int Hi = (int)Math.Floor((double)H / 60) % 6; float f = ((float)H / 60) - Hi; float p = ((float)V / 255) * (1 - ((float)S / 255)); float q = ((float)V / 255) * (1 - f * ((float)S / 255)); float t = ((float)V / 255) * (1 - (1 - f) * ((float)S / 255)); p *= 255; q *= 255; t *= 255; Color rgb = new Color(); switch (Hi) { case 0: rgb = Color.FromArgb(V, (int)t, (int)p); break; case 1: rgb = Color.FromArgb((int)q, V, (int)p); break; case 2: rgb = Color.FromArgb((int)p, V, (int)t); break; case 3: rgb = Color.FromArgb((int)p, (int)q, V); break; case 4: rgb = Color.FromArgb((int)t, (int)p, V); break; case 5: rgb = Color.FromArgb(V, (int)p, (int)q); break; } return rgb; } } } } *2010/10/1 歩兵FPSゲーム初心者教習講座Mad企画書Ver 試作品。 BGM クラシック 語り口調 礼儀作法や研修用ビデオのノリで作る 1 学校で習いましたね。 道路を横切るときは必ず左右確認忘れずに。 道路に限らず開けた場所は、絶好のスナイプポイント。 運を天にまかして開けた場所に出るのは、道路の左右確認もしないで道に飛び出すのと同じ。 よく注意しましょう。 ナレーションは、道路を渡るときは左右を確認しましょうという小学生向けの道路安全講座風味のノリで。 2 建物に入るとき、出来るだけ手榴弾や閃光弾を投げ入れれましょう。 それが礼儀です。 (ナレーションや文章は礼儀作法のビデオのノリで) 3 スナイプポイントへの通り道は格好の待ち伏せ場所。 スナイプポイントへ向かう敵を逆に待ち伏せしてあげましょう。 ナレーションは客をキャッチセールスするとき、客をどう捕まえるかの研修用ビデオ風味のノリで) 4 戦車、乗り物の操縦方法 (車の教習講座風味のノリでナレーションを入れる) 以下このノリで初心者向けMAD映像を作りたい。