visualbasic2010:バイナリファイルをグラフ表示
visualbasic2010 で、 符号付き2バイトバイナリのファイルを読み込んでグラフ化したい。
1.データを2バイトずつ数値化しながら読み込むにはどうしたらいいでしょう?
2.それを折れ線グラフで表示するにはどうすればいいでしょう?
宜しくお願いします。
例:02 13 FF 9D というデータを読み込んだ場合
1.10進数で 531 -99と読み込む
2.折れ線グラフで(データは531と-99)表示したい。
visualbasic2010:バイナリファイルをグラフ表示
visualbasic2010 で、 符号付き2バイトバイナリのファイルを読み込んでグラフ化したい。
1.データを2バイトずつ数値化しながら読み込むにはどうしたらいいでしょう?
2.それを折れ線グラフで表示するにはどうすればいいでしょう?
宜しくお願いします。
例:02 13 FF 9D というデータを読み込んだ場合
1.10進数で 531 -99と読み込む
2.折れ線グラフで(データは531と-99)表示したい。
2バイトずつ読み込むのとエンディアンの関係で上位と下位を変えなければいけないと思います。
最初にByteで全部読み込んでReverseかけて最後から2バイトずつBitConverter.ToInt16するのと、2バイトずつ読み込んでReverseかけてBitConverter.ToInt16かけてます。
もっと効率のいい方法があるかもしれません。(ありそうな気が・・・)
他にもっといい方法がない場合はどうでしょうか。
[ まとめて読む場合 ]
Sub sample()
Dim s() As Short ‘結果が入っている配列
Dim b As Byte() = System.IO.File.ReadAllBytes(“C:\testtest.dat”)
Array.Reverse(b)
ReDim s(b.Length 2 – 1)
For i As Integer = 0 To s.Length – 1
s(s.Length – 1 – i) = BitConverter.ToInt16(b, i * 2)
Next
End Sub
[ 2バイトずつ読む場合 ]
Sub sample()
Dim s() As Short ‘結果が入っている配列
Dim fs As New System.IO.FileStream(“C:\testtest.dat”, System.IO.FileMode.Open, System.IO.FileAccess.Read)
Dim l As Integer = CInt(fs.Length)
ReDim s(l 2 – 1)
Dim b(1) As Byte
For i = 0 To s.Length – 1
fs.Read(b, 0, 2)
Array.Reverse(b)
s(i) = BitConverter.ToInt16(b, 0)
Next
End Sub
折れ線グラフに表示する事に関しては漠然としすぎて回答不能です。
折れ線グラフは普通(x,y)のペアを結ぶ線が折れ線になるので、(0,531),(1,-99)を結ぶことになると思います。
PictureBox1がある場合です。
Sub sample()
PictureBox1.Image = New Bitmap(PictureBox1.Width, PictureBox1.Height)
Dim g As Graphics = Graphics.FromImage(PictureBox1.Image)
g.TranslateTransform(0, PictureBox1.Height 2) ‘真ん中0
g.ScaleTransform(1, -1) ‘y座標を逆に
g.DrawLine(Pens.Black, 0, 0, PictureBox1.Width, 0)
g.DrawLine(Pens.Red, 0, 53, PictureBox1.Width, -99) ‘0,53 と 1,-99を結ぶ
PictureBox1.Refresh()
End Sub
[ 補足への回答 ]
各点を結びます。
Sub sample()
Dim s() As Short ‘結果が入っている配列
Dim b As Byte() = System.IO.File.ReadAllBytes(“C:testtest.dat”)
Array.Reverse(b)
ReDim s(b.Length 2 – 1)
For i As Integer = 0 To s.Length – 1
s(s.Length – 1 – i) = BitConverter.ToInt16(b, i * 2)
Next
PictureBox1.Image = New Bitmap(PictureBox1.Width, PictureBox1.Height)
Dim g As Graphics = Graphics.FromImage(PictureBox1.Image)
g.TranslateTransform(0, PictureBox1.Height 2) ‘真ん中0
g.ScaleTransform(1, -1) ‘y座標を逆に
g.DrawLine(Pens.Black, 0, 0, PictureBox1.Width, 0)
Dim dx As Single = PictureBox1.Width / (s.Length – 1) ‘Xの幅
Dim dy As Single = 1 ‘Yのスケーリング(必要なら)
For i As Integer = 1 To s.Length – 1
g.DrawLine(Pens.Red, (i – 1) * dx, s(i – 1) * dy, i * dx, s(i) * dy) ‘各点を結ぶ
Next
g.Dispose()
PictureBox1.Refresh()
End Sub
折れ線を描きます。
Sub sample()
Dim ps As Point()
Dim b As Byte() = System.IO.File.ReadAllBytes(“C:testtest.dat”)
Array.Reverse(b)
ReDim ps(b.Length 2 – 1)
Dim dx As Single = PictureBox1.Width / (ps.Length – 1) ‘Xの幅
Dim dy As Single = 1 ‘Yのスケーリング(必要なら)
For i As Integer = 0 To ps.Length – 1
ps(i) = New Point(dx * i, dy * BitConverter.ToInt16(b, i * 2)) ‘pointの配列に追加
Next
PictureBox1.Image = New Bitmap(PictureBox1.Width, PictureBox1.Height)
Dim g As Graphics = Graphics.FromImage(PictureBox1.Image)
g.TranslateTransform(0, PictureBox1.Height 2) ‘真ん中0
g.ScaleTransform(1, -1) ‘y座標を逆に
g.DrawLine(Pens.Black, 0, 0, PictureBox1.Width, 0)
g.DrawLines(Pens.Red, ps) ‘折れ線を描く
g.Dispose()
PictureBox1.Refresh()
End Sub
とても分り易いコード例と説明でお答え頂きました。
ありがとうございます。