2016-05-11 8 views
0

.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バイトを何とか読み直していますか?どのような助けが大いに感謝!

+0

困難を、私はあなたが一つの関数にこれをリファクタリングすることを強く示唆していますそれは、filedataと開始値と終了値に基づいてバイト配列を返します。もし1つが機能すれば、両方とも動作します(またはそうでなければなりません) –

+0

ありがとう。そして同意した。しかし、後ろのイメージセクションのbr.BaseStream.Seekとそれに続くbr.ReadBytes呼び出しは、正しく検索しようとしているように見えるでしょうか? –

+0

あなたが作成した "後方"ファイルを見てみてください。最初の2バイトは0x4949または0x4D4Dのいずれかでなければなりません。もしそれで始まらなければ、あなたは正しい場所から読んでいません。 – Duston

答えて

1

上記のコメントのおかげで、.IMGファイルをSystem.Drawing.Imageとして読み込むだけで、個々のページファイルに分割することができました。その後

Dim tiffCheck As Image = Image.FromFile(Path.Combine(DownImageFiles, dr("ImgFile"))) 

、私は基本的にここでは、スプリット()関数の下で解決策を追っ:データがなくても、それだけ助けて https://code.msdn.microsoft.com/windowsdesktop/Split-multi-page-tiff-file-058050cc

+0

これは将来の訪問者にとって便利なので、これを実際に受け入れられた回答とマークする必要があります –

+1

ええ、それは私自身の答えだから2日間はできません。私は間違いなく明日そのことをやろうとします。 –

関連する問題