前提・実現したいこと
オシロの画像データをVB.NETで取得しようとしています。
オシロメーカーからバイナリデータの出力の仕方は教わったのですが、肝心なその後の画像ファイルにする方法までは教えてくれませんでした。
画像データの拡張子はPNGです。
画像データを扱うのは初めてなので、やり方がさっぱり分からないです。
装置メーカーに画像ファイルの生成方法を聞くのも違うかなと思って、こちらに質問を出させていただきました。
発生している問題
バイナリデータもちゃんと取得できているか分かりませんが、ほかのコマンドで測定値は読めるので、出力されている前提でお願いします。 バイナリデータの取り込み方はいろいろと調べて、「試したこと」に記載したコードは見つけました。 ですが、これをどう使うのかが分かりません。
該当のソースコード
VB.NET
1Private Sub hard_copy_Click(sender As Object, e As EventArgs) Handles hard_cpopy.Click 2 3 SerialPort1.Open() 4 5 SerialPort1.WriteLine("HARDCOPY:PORT RS232") 6 SerialPort1.WriteLine("HARDCOPY:FORMAT PNG") 7 SerialPort1.WriteLine("HARDCOPY START") 'ここからバイナリデータが出力されるとメーカーから教わった 8 9 'ここに下記コードでデータは取得できそうですが、そこからPNGファイルに変換したいです 10 '画像ファイルに変換できるのなら、別の方法でも可です 11 12 SerialPort1.Close() 13 14 End Sub
解決したコード
バイト配列をImageオブジェクトに変換するFunctionを追加しています。
(Web上から見つけました)
VB.NET
1 Private Sub hard_cpopy_Click(sender As Object, e As EventArgs) Handles hard_cpopy.Click 2 SerialPort1.Open() 3 SerialPort1.WriteLine("HARDCOPY:PORT RS232") 4 SerialPort1.WriteLine("HARDCOPY:LAYOUT PORTRAIT") 5 SerialPort1.WriteLine("HARDCOPY:INKS ON") 6 SerialPort1.WriteLine("HARDCOPY:FORMAT TIF") 7 SerialPort1.WriteLine("HARDCOPY START") 8 9 Dim img As Byte() 10 img = ReadBinaryData(SerialPort1) 11 12 Dim img2 As Image = ByteArrayToImage(img) 13 14 img2.Save("hard.tif", System.Drawing.Imaging.ImageFormat.Tiff) 15 16 SerialPort1.Close() 17 18 End Sub 19 20 ' バイト配列をImageオブジェクトに変換 21 Public Shared Function ByteArrayToImage(ByVal b As Byte()) As Image 22 Dim img As Image = CType(imgconv.ConvertFrom(b), Image) 23 Return img 24 End Function 25 26 Public Function ReadBinaryData(st As SerialPort) As Byte() 27 Dim buf(32768) As Byte ' 一時バッファ 28 '無限に待たれても困るので、ReadTimeoutがInfiniteTimeoutならとりあえず10秒に設定 29 If st.ReadTimeout = SerialPort.InfiniteTimeout Then 30 st.ReadTimeout = 10000 31 End If 32 Using ms As New MemoryStream() 33 While (True) 34 Try 35 ' シリアルポートから一時バッファに読み込む 36 Dim read As Integer = st.Read(buf, 0, buf.Length) 37 If read > 0 Then 38 ' 一時バッファの内容をメモリ・ストリームに書き込む 39 ms.Write(buf, 0, read) 40 Else 41 Exit While 42 End If 43 Catch ex As TimeoutException 44 'タイムアウト処理も入れておく 45 Exit While 46 End Try 47 End While 48 ' メモリ・ストリームの内容をバイト配列に格納 49 Return ms.ToArray() 50 End Using 51 End Function
上記のコードで期待するTIFF画像を得ることができました。
課題は10秒待たないとTIFFが得られないこと。
オシロからのTIFFデータの転送終了を知ることが出来れば完璧ですが、とりあえず及第点です。
回答いただいた方、ありがとうございました。
回答3件
あなたの回答
tips
プレビュー