我在C#应用程序中从Stream加载多帧TIFF,然后使用Image.Save方法保存它。但是,这只会在第一帧中保存TIFF - 如何保存多帧tiff?
答案 0 :(得分:2)
由于您没有提供任何详细信息......只是一些常规提示:
多帧TIFF是非常复杂的文件 - 例如,每个帧可以具有不同的编码...单个Bitmap
/ Image
无法保存具有所有相关信息的所有帧(如编码)这类文件,一次只能一个。
对于加载,您需要设置参数,该参数告诉类要加载哪个帧,否则它只加载第一个...对于某些代码,请参阅here。
保存多帧TIFF时会出现类似问题 - 您需要使用EncoderParameters
并使用SaveAdd
等等。 - 对于某些正常工作的代码,请参阅here。
答案 1 :(得分:0)
由于指向@Yahia提供的代码的链接已断开,因此我决定发布最终使用的代码。
就我而言,多帧TIFF已经存在,我所需要做的就是加载图像,按EXIF旋转(如有必要)并保存。我不会在这里发布EXIF旋转代码,因为它与这个问题无关。
using (Image img = System.Drawing.Image.FromStream(sourceStream))
{
using (FileStream fileStream = System.IO.File.Create(filePath))
{
int pages = img.GetFrameCount(System.Drawing.Imaging.FrameDimension.Page);
if (pages == 1)
{
img.Save(fileStream, img.RawFormat); // if there is just one page, just save the file
}
else
{
var encoder = System.Drawing.Imaging.ImageCodecInfo.GetImageEncoders().First(x => x.MimeType == fileInfo.MediaType);
var encoderParams = new System.Drawing.Imaging.EncoderParameters(1);
encoderParams.Param[0] = new System.Drawing.Imaging.EncoderParameter(System.Drawing.Imaging.Encoder.SaveFlag, Convert.ToInt32(System.Drawing.Imaging.EncoderValue.MultiFrame));
img.Save(fileStream, encoder, encoderParams); // save the first image with MultiFrame parameter
for (int f = 1; f < pages; f++)
{
img.SelectActiveFrame(FrameDimension.Page, f); // select active page (System.Drawing.Image.FromStream loads the first one by default)
encoderParams.Param[0] = new System.Drawing.Imaging.EncoderParameter(System.Drawing.Imaging.Encoder.SaveFlag, Convert.ToInt32(System.Drawing.Imaging.EncoderValue.FrameDimensionPage));
img.SaveAdd(img, encoderParams); // save add with FrameDimensionPage parameter
}
}
}
}