ハードウェア開発
アプリケーション開発
このままではボタンを押しても何も動作しません。
動作するように、コーディングを行っていきましょう。
[読み込む(L)] ボタンをダブルクリックします。
下の画像のように表示されたと思います。
Button1.Click イベントの Sub プロシージャに次のように記述します。
※ ' を付けるとコメントアウトされ、その行のコードは実行されません。
' OpenFileDialog1 が表示されて、[開く(O)] ボタンがクリックされたら... If OpenFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then ' PictureBox1 に OpenFileDialog1 で選択されたファイルの画像を読み込みます。 PictureBox1.Image = Image.FromFile(OpenFileDialog1.FileName) End If
では早速デバッグしてみましょう。
[読み込む(L)] ボタンをクリックして、[開く] ダイアログが表示され、画像がプログラム内に表示されたら成功です。
※ファイルによってはエラーを吐いたりするかもしれませんが、普段使っているファイルが開ければ問題ありません。
短いテキストならコード上でもいいですが、長いテキストや改行文字が入ると管理が面倒です。
Visual Studio では、初期値をアプリケーションに持たせることができる機能を持っています。
プロジェクトのプロパティを開いて、左のタブの「設定」で編集可能です。
これらのデーターは My.Settings クラスからアクセスできるので、アプリケーションからも容易に利用できます。
My.Settings.foo = "テスト" とするだけで、データーの保存もできるので、保存用のコードを書く必要はありません。
変更させたくないデーターは [リソース] に追加するか、[スコープ] を変更するといいかもしれません。
配列なので [, ] で区切っています。
コア―な部分は、こちらで用意したものをお使いください。
以下のサブプロシージャーは Public Class Form1 と Private Sub Button1_Click の間に入れれば、分りやすいと思います。
※''' がついているのを XML コメント(必須ではありません)と言いますが、これは最後に書いた方がいいかもしれません。
Sub New() ' この呼び出しはデザイナーで必要です。 InitializeComponent() ' InitializeComponent() 呼び出しの後で初期化を追加します。 Dim newImg As Bitmap = New Bitmap(PictureBox1.Size.Width, PictureBox1.Size.Height) 'イメージを適用 PictureBox1.Image = newImg Dim g As Graphics = Graphics.FromImage(PictureBox1.Image) g.FillRectangle(Brushes.White, g.ClipBounds) g.DrawString("イメージのプレビューがここに表示されます", Me.Font, Brushes.Black, New PointF(0, 0)) 'エクスペリエンスの向上 g.PixelOffsetMode = Drawing2D.PixelOffsetMode.HighQuality g.InterpolationMode = Drawing2D.InterpolationMode.NearestNeighbor End Sub
Button2 のクリックイベントハンドラーと次のソースコードを追加します。
Button1 の Click イベントの後 (End Sub の次の行くらい) に追加しておいてください。
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click ' ベースとなるプログラム Dim Base As String = My.Settings.base_code Dim __array_4rep As Object() = New Object() {New String() {"/*array_b0*/", "/*array_c0*/"}, New String() {"/*array_b1*/", "/*array_c1*/"}, New String() {"/*array_b2*/", "/*array_c2*/"}, New String() {"/*array_b3*/", "/*array_c3*/"}} Dim __array_length As Object() = New Object() {New String() {"/*array_b0.lenght*/", "/*array_c0.lenght*/"}, New String() {"/*array_b1.lenght*/", "/*array_c1.lenght*/"}, New String() {"/*array_b2.lenght*/", "/*array_c2.lenght*/"}, New String() {"/*array_b3.lenght*/", "/*array_c3.lenght*/"}} Dim _img As Bitmap = PictureBox1.Image Dim ImageSize As Size = New Size(12, PictureBox1.Image.Size.Height) Base = GetDecData(Base, My.Settings.split_string, _img, __array_4rep(0), ImageSize, Color.FromArgb(0, 0, 0)) '配列の長さを取得 Base = Base.Replace(__array_length(0)(0), ImageSize.Height) Base = Base.Replace(__array_length(0)(1), ImageSize.Height) '時間 Base = Base.Replace("/*time.ms*/", "1000") '置換されないテキストを置換しておく For count As Integer = 0 To 3 Base = Base.Replace(__array_4rep(count)(0), "") Base = Base.Replace(__array_4rep(count)(1), "") Base = Base.Replace(__array_length(count)(0), "0") Base = Base.Replace(__array_length(count)(1), "0") Next ' コードを表示 TextBox1.Text = Base ' TextBox1 を選択状態に TextBox1.Select() ' すべてのテキストを選択 TextBox1.SelectAll() End Sub ''' <summary> ''' 画像データーを 2 進数にする ''' </summary> ''' <param name="Base">適用先のコード</param> ''' <param name="SplitText">複数データーが存在するときの区切り文字</param> ''' <param name="AnalyzeImage">調べる画像</param> ''' <param name="__array_4rep">置換するテキスト</param> ''' <param name="ImageSize">調べるイメージの最大値</param> ''' <param name="CheckColor">判定する色</param> ''' <returns>2進数にしたテキストデーターを含むコード</returns> ''' <remarks></remarks> Function GetDecData(ByVal Base As String, ByVal SplitText As String, ByRef AnalyzeImage As Bitmap, ByVal __array_4rep() As String, ByVal ImageSize As Size, ByVal CheckColor As Color) As String Dim _top As String = "0b" Dim _ArrayCount As Integer = 0 For i As Integer = 0 To __array_4rep.Length - 1 Step 2 Dim _imgpx_dec() As String = New String() {"", "", ""} Dim _array As String = "" Dim _value, _count As Integer Dim _temp_decvalue As String If AnalyzeImage IsNot Nothing Then For _Height As Integer = 0 To AnalyzeImage.Height - 1 If (_Height = ImageSize.Height) Then Exit For End If _value = 0 _count = 0 _temp_decvalue = "" For _Width As Integer = 0 To AnalyzeImage.Width - 1 If (_Width = ImageSize.Width) Then Exit For End If Dim _found As Boolean = False '色の判定 Dim AnalyzeColor As Color = AnalyzeImage.GetPixel(_Width, _Height) If (AnalyzeColor.R = CheckColor.R) And (AnalyzeColor.G = CheckColor.G) And (AnalyzeColor.B = CheckColor.B) Then _found = True End If Dim __count As Integer = _count + 1 If _found Then Do While (__count > 4) __count -= 4 Loop Select Case __count Case 1 _value += 8 Case 2 _value += 4 Case 3 _value += 2 Case 4 _value += 1 End Select End If Dim Program_dec As String = _value '2進数に変換 Program_dec = Convert.ToString(_value, 2) '0を0000にする If (Program_dec = "0") Then Program_dec = "0000" End If '4桁になるように0を挿入していく While (Program_dec.Length < 4) Program_dec = "0" & Program_dec.ToString End While Select Case _count Case 11 '2つ目の配列に2進数のデーターを記録 _imgpx_dec(1) &= _top & Program_dec.ToString & "0000" If (_Height < ImageSize.Height - 1) Then '最後ではないときに、2つ目の配列に区切りの文字を挿入 _imgpx_dec(1) &= SplitText End If _value = 0 Case 7 '1つ目の配列に2進数のデーターを記録 _imgpx_dec(0) &= _top & _temp_decvalue.ToString & Program_dec.ToString If (_Height < ImageSize.Height - 1) Then '最後ではないときに、1つ目の配列に区切りの文字を挿入 _imgpx_dec(0) &= SplitText End If _value = 0 Case 3 '一時的に2進数にしたテキストを保持 _temp_decvalue = Program_dec _value = 0 End Select _count += 1 Next Next Else _array = "" End If _array = _imgpx_dec(0) Base = Base.Replace(__array_4rep(i), _array) _array = _imgpx_dec(1) Base = Base.Replace(__array_4rep(i + 1), _array) _ArrayCount += 1 Next Return Base End Function
全部折りたためば、こんな感じになっているはずです。
デバッグして、このような動作をしていれば、完成です。