Как сохранить многостраничное изображение в формате Tiff в поток памяти?C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Как сохранить многостраничное изображение в формате Tiff в поток памяти?

Сообщение Anonymous »

У меня возникли проблемы при попытке сохранить многостраничное изображение в формате tiff в MemoryStream. Я видел много материалов о том, как сохранить многостраничный TIFF, но все примеры сохраняют изображение в файл, а не в MemoryStream.
Когда я сохраняю в файл, это работает как и ожидалось (давая мне три страницы в формате tiff на диске). Однако, когда я пытаюсь сохранить в MemoryStream, а затем взять этот MemoryStream и сохранить в файл, я получаю только первую страницу.
Вот то, что у меня есть сейчас, и это только в конце концов давая мне первую страницу.

Код: Выделить всё

public void Test()
{
// Add 3 image files to the cache list
List imageCache = new List();
imageCache.Add(Image.FromFile(@"c:\test\testInput1.tif"));
imageCache.Add(Image.FromFile(@"c:\test\testInput2.tif"));
imageCache.Add(Image.FromFile(@"c:\test\testInput3.tif"));

// Get the tiff image codec
ImageCodecInfo codec = ImageCodecInfo.GetImageEncoders().Where(c => c.MimeType == "image/tiff").First();
if (codec == null)
throw new Exception("Tiff codec not found.");

// Create compression encoder parameter
EncoderParameter compressionParam = new EncoderParameter(Encoder.Compression, (long)EncoderValue.CompressionCCITT4);

// Create first page frame parameter
EncoderParameter firstFrameParam = new EncoderParameter(Encoder.SaveFlag, (long)EncoderValue.MultiFrame);

// Create additional pages frame parameter
EncoderParameter additionalFramesParam = new EncoderParameter(Encoder.SaveFlag, (long)EncoderValue.FrameDimensionPage);

// Create color depth parameter
EncoderParameter colorDepthParam = new EncoderParameter(Encoder.ColorDepth, (long)1);

// Create flush parameter
EncoderParameter flushParam = new EncoderParameter(Encoder.SaveFlag, (long)EncoderValue.Flush);

// Create last frame parameter
EncoderParameter lastPageParam = new EncoderParameter(Encoder.SaveFlag, (long)EncoderValue.LastFrame);

// Create first page encoder parameters
EncoderParameters firstFrameParams = new EncoderParameters(2)
{
Param = new EncoderParameter[]
{
compressionParam,
firstFrameParam,
}
};

// Create additional pages encoder parameters
EncoderParameters additionalFrameParams = new EncoderParameters(2)
{
Param = new EncoderParameter[]
{
compressionParam,
additionalFramesParam,
}
};

// Create save to file encoder parameters
EncoderParameters saveToFileParams = new EncoderParameters(2)
{
Param = new EncoderParameter[]
{
compressionParam,
colorDepthParam,
}
};

// Create flush encoder parameters
EncoderParameters flushParams = new EncoderParameters(1)
{
Param = new EncoderParameter[]
{
flushParam,
lastPageParam,
}
};

// Save the bitmap to memory as tiff
using (MemoryStream byteStream = new MemoryStream())
{
_imageCache[0].Save(byteStream, ImageFormat.Tiff);

// Put Tiff into another Image object
using (Image tiff = Image.FromStream(byteStream))
{
// Save to file - Uncomment next line for working solution
// tiff.Save(@"c:\test\testOutput.tif", codec, firstFrameParams);

// Save to a memory stream - Comment out next two lines for working solution
using (MemoryStream tiffStream = new MemoryStream())
{
tiff.Save(tiffStream, codec, firstFrameParams);

// For subsequent pages, prepare encoders
for (int page = 1; page < _imageCache.Count; page++)
tiff.SaveAdd(_imageCache[page], additionalFrameParams);

// Finally flush the file
tiff.SaveAdd(flushParams);

// Save the image in memory to a file - Comment out next two lines for working solution
using (Image tiffOutput = Image.FromStream(tiffStream))
tiffOutput.Save(@"c:\test\testOutput.tif", codec, saveToFileParams);
}
}
}
}
Стоит отметить, что объект изображения tiffOutput при создании из потока НЕ ​​содержит ожидаемые 3 кадра, а только 1 (первую) страницу. Это похоже на то, что метод Image.SaveAdd не работает с потоками памяти, хотя он и утверждает, что работает.

Подробнее здесь: https://stackoverflow.com/questions/791 ... ory-stream
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»