2016-05-11 10 views
0

Работа с некоторым устаревшим кодом, который анализирует изображения .TIF (передние и обратные изображения для проверок) из файла .IMG. Например, у меня есть следующий файл: 05090001.IMG, а затем у меня есть следующие значения об этом файле:Прочитайте два файла .TIF из файла .IMG

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? Я как-то читаю первые 6372 байта вместо того, чтобы пропустить первый 10600 и начать там? Любая помощь очень ценится!

+0

Трудно помочь, что многое, не имея данных, но я бы настоятельно рекомендуем вам реорганизовать это в одну функцию который возвращает массив байтов на основе filedata и начальных и конечных значений, тогда, если один работает, они оба работают (или должны) –

+0

Спасибо. И согласился. Но делают ли запросы br.BaseStream.Seek и последующие вызовы br.ReadBytes в задней части изображения, похоже, они будут стремиться, а затем правильно читать? –

+0

Одна диагностика, которую вы можете попробовать, - это посмотреть на «задний» файл, который вы создали. Первые два байта должны быть либо 0x4949, либо 0x4D4D. Если это не начинается с этого, вы не читаете нужное место. – Duston

ответ

1

Благодаря нескольким людям в комментариях выше, я обнаружил, что просто загружая файл .IMG в виде System.Drawing.Image, я мог бы разделить его на отдельные файлы страниц.

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

После этого я в основном следовал за решение по функции Split() здесь: https://code.msdn.microsoft.com/windowsdesktop/Split-multi-page-tiff-file-058050cc

+0

Это полезно для будущего посетителя, поэтому вы должны действительно отметить это как принятый ответ –

+1

Да, но это не позволит мне в течение 2 дней, потому что это мой собственный ответ , Я обязательно постараюсь это сделать завтра. –