保存多帧TIFF

时间:2012-02-16 19:35:18

标签: c# tiff

我在C#应用程序中从Stream加载多帧TIFF,然后使用Image.Save方法保存它。但是,这只会在第一帧中保存TIFF - 如何保存多帧tiff?

2 个答案:

答案 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
      }
    }
  }
}
  • sourceStream 是一个System.IO.MemoryStream,它保存文件内容的字节数组
  • filePath 是缓存目录的绝对路径(类似于'C:/Cache/multiframe.tiff')
  • fileInfo 是一个模型,其中包含实际的字节数组,fileName,mediaType和其他数据