C# 保存多帧TIFF

C# 保存多帧TIFF,c#,tiff,C#,Tiff,我从C#应用程序中的流中加载一个多帧TIFF,然后使用Image.save方法保存它。但是,这只保存第一帧的TIFF-如何让它保存多帧TIFF?因为您没有提供任何详细信息。。。只是一些一般提示: 多帧TIFF是非常复杂的文件-例如,每个帧可以有不同的编码。。。单个位图/图像无法保存包含此类文件所有相关信息(如编码和类似信息)的所有帧,一次只能保存一个 对于加载,您需要设置参数,该参数告诉类要加载哪个帧,否则它只加载第一帧。。。有关一些代码,请参阅 保存多帧TIFF时也会出现类似问题-此处您需要使

我从C#应用程序中的流中加载一个多帧TIFF,然后使用Image.save方法保存它。但是,这只保存第一帧的TIFF-如何让它保存多帧TIFF?

因为您没有提供任何详细信息。。。只是一些一般提示:

多帧TIFF是非常复杂的文件-例如,每个帧可以有不同的编码。。。单个
位图
/
图像
无法保存包含此类文件所有相关信息(如编码和类似信息)的所有帧,一次只能保存一个

对于加载,您需要设置参数,该参数告诉类要加载哪个帧,否则它只加载第一帧。。。有关一些代码,请参阅


保存多帧TIFF时也会出现类似问题-此处您需要使用和使用等-有关一些工作代码,请参阅。

由于@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
      }
    }
  }
}
使用(Image img=System.Drawing.Image.FromStream(sourceStream))
{
使用(FileStream FileStream=System.IO.File.Create(filePath))
{
int pages=img.GetFrameCount(System.Drawing.Imaging.FrameDimension.Page);
如果(页数==1)
{
Save(fileStream,img.RawFormat);//如果只有一个页面,只需保存文件即可
}
其他的
{
var encoder=System.Drawing.Imaging.ImageCodeInfo.GetImageEncoders().First(x=>x.MimeType==fileInfo.MediaType);
var encoderParams=新系统.绘图.成像.编码参数(1);
encoderParams.Param[0]=新的System.Drawing.Imaging.EncoderParameter(System.Drawing.Imaging.Encoder.SaveFlag,Convert.ToInt32(System.Drawing.Imaging.EncoderValue.MultiFrame));
Save(fileStream、encoder、encoderParams);//使用MultiFrame参数保存第一个图像
对于(int f=1;f
  • sourceStream是一个System.IO.MemoryStream,它保存文件内容的字节数组
  • filePath是缓存目录的绝对路径(类似于'C:/cache/multiframe.tiff')
  • fileInfo是一个保存实际字节数组、文件名、媒体类型和其他数据的模型

您提供的链接的可能副本是用于加载而不是保存…该链接还包括答案,尽管实际上是在问题中:“TIFF是使用Image.SaveAdd方法逐帧保存的”。