Когда я сохраняю в файл, это работает как и ожидалось (давая мне три страницы в формате 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);
}
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/791 ... ory-stream