Таким образом, решение оказалось очень простым - я понял, что сохранение каждого кадра отдельно в поток ответов было основной причиной, по которой верхний кадр был единственным отображаемым в браузере кадром.
Вот фрагмент из функции, которую я написал, чтобы собрать все необходимые параметры из изображения (хотя и многокадровые TIFF, однокадровые TIFF или JPEG):
Dim iFile As Image = Image.FromFile(imageLocation)
Dim frameCount As Integer = iFile.GetFrameCount(FrameDimension.Page)
Dim totalWidth, totalHeight As Integer
If (imageLocation.ToUpper.EndsWith("TIF")) Then
Dim i As Integer
If (frameCount > 1) Then
totalWidth = 0
totalHeight = 0
For i = 0 To frameCount - 1
iFile.SelectActiveFrame(FrameDimension.Page, i)
imageStructure.totalWidth = Math.Max(totalWidth, (iFile.Width * 0.4))
imageStructure.totalHeight += (iFile.Height * 0.4)
returnImage = New Bitmap(iFile, iFile.Width * 0.4, iFile.Height * 0.4)
imageList.Add(returnImage)
Next i
Else
returnImage = New Bitmap(iFile, iFile.Width * 0.4, iFile.Height * 0.4)
imageStructure.totalWidth = (iFile.Width * 0.4)
imageStructure.totalHeight = (iFile.Height * 0.4)
imageList.Add(returnImage)
End If
Else
Dim scaledWidth As Integer = (iFile.Width / iFile.Height) * defaultHeight
returnImage = New Bitmap(iFile, scaledWidth, defaultHeight)
imageStructure.totalWidth = scaledWidth
imageStructure.totalHeight = defaultHeight
imageList.Add(returnImage)
End If
iFile.Dispose()
imageStructure.frameCount = frameCount
imageStructure.frameList = imageList
Вот фрагмент кода, который отображает изображения:
If (imageStructure.frameCount > 1) Then
'We know we have a multi-frame TIFF
Dim appendedImage As Bitmap = New Bitmap(imageStructure.totalWidth, imageStructure.totalHeight)
imgGraphics = Graphics.FromImage(appendedImage)
Dim prevHeight As Integer = 0
For Each img In imageStructure.frameList
imgGraphics.DrawImage(img, 0, prevHeight, img.Width, img.Height)
prevHeight += img.Height
img.Dispose()
Next
appendedImage.Save(context.Response.OutputStream, ImageFormat.Jpeg)
appendedImage.Dispose()
Else
' JPEG or single frame TIFF
img = imageStructure.frameList(0)
imgGraphics = Graphics.FromImage(img)
imgGraphics.DrawImage(img, 0, 0, img.Width, img.Height)
img.Save(context.Response.OutputStream, ImageFormat.Jpeg)
img.Dispose()
End If
Примечание: Переменная imageStructure - это тривиальная структура, в которой хранятся общая ширина, высота, количество кадров и список изображений, представляющих каждый кадр.
Теперь у меня есть какой-то рефакторинг, и все будет готово! Я надеюсь, что кто-то еще находит это полезным ...