質問編集履歴

1

解決したコードを記載

2021/04/11 22:27

投稿

退会済みユーザー
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
- Public Shared Function ReadBinaryData(ByVal st As Stream) As Byte()
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 buf(32768) As Byte ' 一時バッファ
101
+ Dim img As Byte()
102
+
103
+ img = ReadBinaryData(SerialPort1)
86
104
 
87
105
 
88
106
 
89
- Using ms As New MemoryStream()
107
+ Dim img2 As Image = ByteArrayToImage(img)
90
108
 
91
109
 
92
110
 
93
- While (True)
94
-
95
- ' ストリームから一時バッファに読み込む
96
-
97
- Dim read As Integer = st.Read(buf, 0, buf.Length)
111
+ img2.Save("hard.tif", System.Drawing.Imaging.ImageFormat.Tiff)
98
112
 
99
113
 
100
114
 
101
- If read > 0 Then
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 If
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
- 装置制限でJPEGでの出力はきないです。
193
+ オシロからTIFFデータ転送終了を知ることが来れば完璧すが、とりあえず及第点です。
134
194
 
135
195
 
136
196
 
137
- よろしくお願いします
197
+ 回答ただいた方、ありがとうございま