【问题标题】:Extract frame from multi page tiff - c#从多页 tiff 中提取框架 - c#
【发布时间】:2020-04-23 13:44:22
【问题描述】:

有一个多页 tiff,我想从这个 Tiff 文件中提取 page[n]/frame[n] 并保存它。

如果我的多页 tiff 有 3 帧,在我提取一页/帧后 - 我想留下

1 张图片有 2 页/帧和

1 张图片只有 1 页/帧。

【问题讨论】:

    标签: c#


    【解决方案1】:

    这里有一些代码可以将多帧 tiff 中的最后一帧保存到单页 tiff 文件中。 (要使用此代码,您需要添加对 PresentationCore.dll 的引用)。

    Stream imageStreamSource = new FileStream(imageFilename, FileMode.Open, FileAccess.Read, FileShare.Read);
            MemoryStream memstream = new MemoryStream();
            memstream.SetLength(imageStreamSource.Length);
            imageStreamSource.Read(memstream.GetBuffer(), 0, (int)imageStreamSource.Length);
            imageStreamSource.Close();
    
            BitmapDecoder decoder = TiffBitmapDecoder.Create(memstream,BitmapCreateOptions.PreservePixelFormat,BitmapCacheOption.Default);
    
            Int32 frameCount = decoder.Frames.Count;
    
            BitmapFrame imageFrame = decoder.Frames[0];
    
            MemoryStream output = new MemoryStream();
            TiffBitmapEncoder encoder = new TiffBitmapEncoder();
            encoder.Frames.Add(imageFrame);
            encoder.Save(output);
    
            FileStream outStream = File.OpenWrite("Image.Tiff");
            output.WriteTo(outStream);
            outStream.Flush();
            outStream.Close();
            output.Flush();
            output.Close();
    

    【讨论】:

    • 为了使用此代码,您需要添加对 PresentationCore.dll 的引用,该引用可在您的“[Program Files]/Reference Assemblies”文件夹中找到。此程序集包含“System.Windows.Media.Imaging”命名空间。
    【解决方案2】:
        public void SaveFrame(string path, int frameIndex, string toPath)
        {
            using (FileStream stream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read))
            {
                BitmapDecoder dec = BitmapDecoder.Create(stream, BitmapCreateOptions.IgnoreImageCache, BitmapCacheOption.None);
                BitmapEncoder enc = BitmapEncoder.Create(dec.CodecInfo.ContainerFormat);
    
                enc.Frames.Add(dec.Frames[frameIndex]);
    
                using (FileStream tmpStream = new FileStream(toPath, FileMode.Create))
                {
                    enc.Save(tmpStream);
                }
            }
        }
    

    【讨论】:

      【解决方案3】:

      使用ImageMagick,提取页面是一个简单的单行:

      convert input.tif[page] output.tif
      

      要提取一系列页面,请将[page] 替换为[frompage-topage]。请务必注意,页数从零开始

      在您的情况下,您必须运行该命令两次,但 ImageMagick 非常强大,我敢打赌还有另一个单行命令可以按照您想要的方式进行拆分。

      没用过C#,不知道能不能用在你的代码里面。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-12-05
        • 2012-02-03
        • 1970-01-01
        • 2019-06-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多