【问题标题】:Saving a multi frame TIFF保存多帧 TIFF
【发布时间】:2012-02-16 19:35:18
【问题描述】:

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

【问题讨论】:

标签: c# tiff


【解决方案1】:

由于您没有提供任何详细信息...只是一些一般性提示:

多帧 TIFF 是非常复杂的文件 - 例如,每一帧都可以有不同的编码...单个 Bitmap/Image 不能保存所有具有所有相关信息(如编码和类似信息)的帧这样的文件,一次只有一个。

对于加载,您需要设置参数来告诉类要加载哪个框架,否则它只会加载第一个...有关一些代码,请参见here

保存多帧 TIFF 时会出现类似问题 - 在这里您需要使用 EncoderParameters 并使用 SaveAdd 等 - 对于一些工作代码,请参阅 here

【讨论】:

    【解决方案2】:

    由于@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 等数据的模型

    【讨论】:

      猜你喜欢
      • 2021-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多