visualbasic2010:バイナリファイルをグラフ表示 visualbasic2010 &#8… | 質問の答えを募集中です! visualbasic2010:バイナリファイルをグラフ表示 visualbasic2010 &#8… | 質問の答えを募集中です!

visualbasic2010:バイナリファイルをグラフ表示 visualbasic2010 …

未分類

visualbasic2010:バイナリファイルをグラフ表示
visualbasic2010 で、 符号付き2バイトバイナリのファイルを読み込んでグラフ化したい。

1.データを2バイトずつ数値化しながら読み込むにはどうしたらいいでしょう?
2.それを折れ線グラフで表示するにはどうすればいいでしょう?

宜しくお願いします。

例:02 13 FF 9D というデータを読み込んだ場合
1.10進数で 531 -99と読み込む
2.折れ線グラフで(データは531と-99)表示したい。

  1. 匿名 より:

    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

  2. 匿名 より:

    とても分り易いコード例と説明でお答え頂きました。
    ありがとうございます。



 ⬇人気の記事!⬇

タイトルとURLをコピーしました