从多页tiff中提取帧 - c#

时间:2010-08-03 17:07:07

标签: c#

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

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

1张图像,有2页/帧和

只有1页/帧的1张图片。

3 个答案:

答案 0 :(得分:6)

这是一些代码,用于将多帧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();

答案 1 :(得分:1)

    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);
            }
        }
    }

答案 2 :(得分:0)

使用ImageMagick提取页面很简单:

convert input.tif[page] output.tif

要提取一定范围的页面,请将[page]替换为[frompage-topage]。重要的是要注意,页数从零开始

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

从未使用过C#,所以我不知道是否可以在您的代码中使用它。