日々の記録

ほどよく書いてきます。

keyence VHX画像データから測定値を吸い上げる

2018年06月02日 22時31分35秒 | プログラム

キーエンスのVHXというデジタルマイクロスコープをよく使っているが、寸法計測した値をたくさん処理するときに面倒があった。

csvファイルを保存してそのデータを読み込む。→面倒くさい

しかし、VHXの画面上でjpg画像を見るとデータありみたいなアイコンになるので、jpgファイルにデータが埋め込まれているはずだと考えた。

自動でまとめまでできれば、jpgだけ持って帰って処理すればいいので楽になる。

バイナリデータを見る限り、末尾に測定値が埋め込まれているようだ。しかもプレーンテキストで。ラッキー。
では、これらを取り出して必要なデータを取り出せばcsvファイル出力の一手間が省略できる。

[メイン]以下のデータだけで済むだろうから、そこを取り出す。おそらくバイナリを比較して[ メイン ]の文字を探して行けばいいが、作り始めたときはjpgデータ無いに文字列と同じバイナリ列があるかもと思ってjpgファイルのFFD9(0xFF 0xD9)のデータを探したあとに文字列を探すことにした。

jpgファイルは、0xFFが特徴的な識別子になっていて、jpg構造の最後には0xFF 0xD9の2バイト並びでファイルが終了する。しかし、サムネイルを含んでいる場合はサムネイルもまたjpg構造を持っているので、ファイルの最後の0xFF 0xD9を探し、それ以降のテキストを比較することにした。

 

command button1,2は上のボタンです。出力行が21だったり、変数固定の部分がいくらかあります。赤文字は上の表の当該セルなので場所を変えたらソースも変えてください。

Const StartCol = 20
Option Explicit
Private Sub CommandButton1_Click()
Dim FileName
Dim FileNames

FileNames = Application.GetOpenFilename("VHX jpg files,*.jpg", , , , True)
If TypeName(FileNames) <> "Variant()" Then
    Exit Sub
End If

For Each FileName In FileNames
    Call ConvertVHXimageFile(FileName, ConvertFileName(FileName))
    
Next FileName

MsgBox "done"

End Sub

Function ConvertFileName(VHXimageFileName) As String
    'ファイル名の拡張子をtxtにするだけ。関数にせんでもよかったな。
    ConvertFileName = Left(VHXimageFileName, InStrRev(VHXimageFileName, ".")) & "csv"
End Function

Sub ConvertVHXimageFile(VHXimageFileName, OutputTextFileName As String)

Dim Fn As Integer   'ファイル入出力番号として
Dim i As Long       'どっかで使う
Dim j As Long

Dim EOBinary As Long    'jpgのバイナリが終わる位置
Dim TxtStart As Long    'テキスト開始位置
Dim VHXimage() As Byte  'jpg画像のバイナリを入れる配列

'ファイルを開いて配列に入れる
Fn = FreeFile
Open VHXimageFileName For Binary As #Fn
    ReDim VHXimage(LOF(Fn))
    Get #Fn, , VHXimage
Close #Fn

'jpgデータ終わりを示すFFD9を探す
'なぜかVHXの画像には複数のFFD9があるから最後まで探す
For i = 0 To UBound(VHXimage) - 1
    If VHXimage(i) = &HFF And VHXimage(i + 1) = &HD9 Then
        EOBinary = i
    End If
Next i

'[ メイン ]の文字列を探す
Dim HeaderOfText() As Byte
HeaderOfText = StrConv("""[ メイン ]""", vbFromUnicode) '文字列をバイナリ配列にしておく
Dim SizeOfHeader As Long
    SizeOfHeader = UBound(HeaderOfText)

'データ探し
For i = EOBinary To UBound(VHXimage) - SizeOfHeader
    For j = 0 To SizeOfHeader
        If VHXimage(i + j) <> HeaderOfText(j) Then '文字列が違ったらすっ飛ばし
            Exit For
        End If
        
        If j = 9 Then       '文字列合致が9回?連続したら本物 ■9回じゃなくて、変数にできるやろ
            TxtStart = i    'そこがtextの開始行だ!
            Exit For
        End If
    Next j
Next i

'出力ファイルの準備。
Dim OutTxt() As Byte
'サイズの定義
ReDim OutTxt(UBound(VHXimage) - TxtStart)

For i = TxtStart To UBound(VHXimage)
    OutTxt(i - TxtStart) = VHXimage(i)
Next i

'ファイル出力
Fn = FreeFile
Open OutputTextFileName For Binary As #Fn
    For i = 0 To UBound(OutTxt) - 1
        Put #Fn, , OutTxt(i)
    Next i
Close #Fn
End Sub
コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« DarkSiteFinder | トップ | 宮古島の通信インフラの停電耐性 »

コメントを投稿

プログラム」カテゴリの最新記事