Работа с некоторым устаревшим кодом, который анализирует изображения .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 и начать там? Любая помощь очень ценится!
Трудно помочь, что многое, не имея данных, но я бы настоятельно рекомендуем вам реорганизовать это в одну функцию который возвращает массив байтов на основе filedata и начальных и конечных значений, тогда, если один работает, они оба работают (или должны) –
Спасибо. И согласился. Но делают ли запросы br.BaseStream.Seek и последующие вызовы br.ReadBytes в задней части изображения, похоже, они будут стремиться, а затем правильно читать? –
Одна диагностика, которую вы можете попробовать, - это посмотреть на «задний» файл, который вы создали. Первые два байта должны быть либо 0x4949, либо 0x4D4D. Если это не начинается с этого, вы не читаете нужное место. – Duston