質問編集履歴
1
解決したコードを記載
test
CHANGED
@@ -1 +1 @@
|
|
1
|
-
VB.NETで制御している装置(オシロ)から画像データを取得したい
|
1
|
+
VB.NETで制御している装置(オシロ)から画像データを取得したい(解決しました)
|
test
CHANGED
@@ -72,53 +72,113 @@
|
|
72
72
|
|
73
73
|
|
74
74
|
|
75
|
-
###
|
75
|
+
### 解決したコード
|
76
|
+
|
77
|
+
バイト配列をImageオブジェクトに変換するFunctionを追加しています。
|
78
|
+
|
79
|
+
(Web上から見つけました)
|
76
80
|
|
77
81
|
|
78
82
|
|
79
|
-
```VB.NET
|
83
|
+
``` VB.NET
|
80
84
|
|
81
|
-
Pub
|
85
|
+
Private Sub hard_cpopy_Click(sender As Object, e As EventArgs) Handles hard_cpopy.Click
|
86
|
+
|
87
|
+
SerialPort1.Open()
|
88
|
+
|
89
|
+
SerialPort1.WriteLine("HARDCOPY:PORT RS232")
|
90
|
+
|
91
|
+
SerialPort1.WriteLine("HARDCOPY:LAYOUT PORTRAIT")
|
92
|
+
|
93
|
+
SerialPort1.WriteLine("HARDCOPY:INKS ON")
|
94
|
+
|
95
|
+
SerialPort1.WriteLine("HARDCOPY:FORMAT TIF")
|
96
|
+
|
97
|
+
SerialPort1.WriteLine("HARDCOPY START")
|
82
98
|
|
83
99
|
|
84
100
|
|
85
|
-
Dim
|
101
|
+
Dim img As Byte()
|
102
|
+
|
103
|
+
img = ReadBinaryData(SerialPort1)
|
86
104
|
|
87
105
|
|
88
106
|
|
89
|
-
|
107
|
+
Dim img2 As Image = ByteArrayToImage(img)
|
90
108
|
|
91
109
|
|
92
110
|
|
93
|
-
While (True)
|
94
|
-
|
95
|
-
' ストリームから一時バッファに読み込む
|
96
|
-
|
97
|
-
|
111
|
+
img2.Save("hard.tif", System.Drawing.Imaging.ImageFormat.Tiff)
|
98
112
|
|
99
113
|
|
100
114
|
|
101
|
-
|
115
|
+
SerialPort1.Close()
|
102
116
|
|
103
|
-
' 一時バッファの内容をメモリ・ストリームに書き込む
|
104
117
|
|
105
|
-
ms.Write(buf, 0, read)
|
106
118
|
|
119
|
+
End Sub
|
120
|
+
|
121
|
+
|
122
|
+
|
123
|
+
' バイト配列をImageオブジェクトに変換
|
124
|
+
|
125
|
+
Public Shared Function ByteArrayToImage(ByVal b As Byte()) As Image
|
126
|
+
|
127
|
+
Dim img As Image = CType(imgconv.ConvertFrom(b), Image)
|
128
|
+
|
129
|
+
Return img
|
130
|
+
|
131
|
+
End Function
|
132
|
+
|
133
|
+
|
134
|
+
|
135
|
+
Public Function ReadBinaryData(st As SerialPort) As Byte()
|
136
|
+
|
137
|
+
Dim buf(32768) As Byte ' 一時バッファ
|
138
|
+
|
139
|
+
'無限に待たれても困るので、ReadTimeoutがInfiniteTimeoutならとりあえず10秒に設定
|
140
|
+
|
141
|
+
If st.ReadTimeout = SerialPort.InfiniteTimeout Then
|
142
|
+
|
143
|
+
st.ReadTimeout = 10000
|
144
|
+
|
145
|
+
End If
|
146
|
+
|
147
|
+
Using ms As New MemoryStream()
|
148
|
+
|
149
|
+
While (True)
|
150
|
+
|
151
|
+
Try
|
152
|
+
|
153
|
+
' シリアルポートから一時バッファに読み込む
|
154
|
+
|
155
|
+
Dim read As Integer = st.Read(buf, 0, buf.Length)
|
156
|
+
|
157
|
+
If read > 0 Then
|
158
|
+
|
159
|
+
' 一時バッファの内容をメモリ・ストリームに書き込む
|
160
|
+
|
161
|
+
ms.Write(buf, 0, read)
|
162
|
+
|
107
|
-
Else
|
163
|
+
Else
|
164
|
+
|
165
|
+
Exit While
|
166
|
+
|
167
|
+
End If
|
168
|
+
|
169
|
+
Catch ex As TimeoutException
|
170
|
+
|
171
|
+
'タイムアウト処理も入れておく
|
108
172
|
|
109
173
|
Exit While
|
110
174
|
|
111
|
-
End
|
175
|
+
End Try
|
112
176
|
|
113
177
|
End While
|
114
|
-
|
115
|
-
|
116
178
|
|
117
179
|
' メモリ・ストリームの内容をバイト配列に格納
|
118
180
|
|
119
181
|
Return ms.ToArray()
|
120
|
-
|
121
|
-
|
122
182
|
|
123
183
|
End Using
|
124
184
|
|
@@ -126,12 +186,12 @@
|
|
126
186
|
|
127
187
|
```
|
128
188
|
|
189
|
+
上記のコードで期待するTIFF画像を得ることができました。
|
129
190
|
|
191
|
+
課題は10秒待たないとTIFFが得られないこと。
|
130
192
|
|
131
|
-
[別の見つけたHPの記事](https://www.atmarkit.co.jp/ait/articles/0706/07/news139.html)もありましたが、JPEGでなく、今回はPNGです。
|
132
|
-
|
133
|
-
|
193
|
+
オシロからのTIFFデータの転送終了を知ることが出来れば完璧ですが、とりあえず及第点です。
|
134
194
|
|
135
195
|
|
136
196
|
|
137
|
-
|
197
|
+
回答いただいた方、ありがとうございました。
|