.IMGファイルから.TIF画像(チェックのための表と裏の画像)を解析するいくつかのレガシーコードを扱う。たとえば、私は次のファイルを持っています:05090001.IMGそして私はそのファイルに関する以下の値を持っています:.IMGファイルから2つの.TIFファイルを読み取る
FrontStart:8 | FrontLength:10600 |リアスタンス:10608 | RearLength:6372
05090001.IMGのサイズは16980バイトです。したがって、フロントイメージは10600バイトである必要があります。実際には有効な.TIFファイルを作成しますが、リアイメージは常に破損します。
これはフロント.tifファイル取得、既存のコードです:私は後方画像ファイルにアクセスするために同様のコードを追加しようとしている
Dim fs As New FileStream(Me.FileName, FileMode.Open, FileAccess.Read)
Dim sr As New BinaryReader(fs)
Dim fname As String = {long formula to generate fname}
Dim fsFront As New FileStream(fname & "_Front.tif", FileMode.Create)
Dim swFront As New BinaryWriter(fsFront)
Dim imgBytesFront As Byte()
fs = New FileStream(Path.Combine(DownImageFiles, dr("ImgFile")), FileMode.Open, FileAccess.Read)
sr = New BinaryReader(fs)
imgBytesFront = sr.ReadBytes(dr("FrontLength"))
swFront.Write(imgBytesFront)
swFront.Close()
fsFront.Close()
を:
Dim fsRear As New FileStream(fname & "_Rear.tif", FileMode.Create)
Dim swRear As New BinaryWriter(fsRear)
Dim imgBytesRear As Byte()
fs = New FileStream(Path.Combine(DownImageFiles, dr("ImgFile")), FileMode.Open, FileAccess.Read)
Using br As New BinaryReader(fs)
br.BaseStream.Seek(Long.Parse(dr("FrontLength"), Globalization.NumberStyles.Integer), SeekOrigin.Begin)
imgBytesRear = br.ReadBytes(dr("RearLength"))
End Using
imgBytesRear = sr.ReadBytes(dr("RearLength"))
swRear.Write(imgBytesRear)
swRear.Close()
fsRear.Close()
これは、画像を生成し、 Windowsは「破損している、破損している、または大きすぎます」と表示しています。
アイデアは何ですか? Seekメソッドを正しく使用していますか?最初の10600をスキップするのではなく、最初の6372バイトを何とか読み直していますか?どのような助けが大いに感謝!
困難を、私はあなたが一つの関数にこれをリファクタリングすることを強く示唆していますそれは、filedataと開始値と終了値に基づいてバイト配列を返します。もし1つが機能すれば、両方とも動作します(またはそうでなければなりません) –
ありがとう。そして同意した。しかし、後ろのイメージセクションのbr.BaseStream.Seekとそれに続くbr.ReadBytes呼び出しは、正しく検索しようとしているように見えるでしょうか? –
あなたが作成した "後方"ファイルを見てみてください。最初の2バイトは0x4949または0x4D4Dのいずれかでなければなりません。もしそれで始まらなければ、あなたは正しい場所から読んでいません。 – Duston