libtiff.net将多页tiff拆分为单页tiff图像

时间:2014-12-09 20:45:01

标签: c# tiff libtiff.net

我正在尝试使用LibTiff.Net将多页TIFF图像拆分为单页TIFF图像。

我正在两个系统之间构建一个TIFF分裂中介。我将收到多页TIFF图像作为流,然后将其拆分为单独的页面TIFF图像文件,并将它们作为字节数组列表返回。

我调用一个Web服务,它将多页TIFF图像作为流返回。我需要将每个页面作为单独的TIFF图像提取,以将它们作为字节数组列表返回。 我见过TiffCP实用程序可以将磁盘上的多页映像拆分为磁盘上的单独TIFF映像文件。如果我可以避免,我不想在此操作期间向磁盘写入任何内容。

我也不想解码输入图像的任何图像内容,因为这会浪费处理时间。

这可能与LibTiff.Net有关吗?

更新 @bobrovsky - 感谢您的建议。

这是我尝试过的。我从TiffCP的源代码中取出了Copier类,在我的项目中使用它进行零编辑。下面的代码是我如何使用它。当这段代码完成执行时,应该在其中包含整个单页TIFF图像的MemoryStream对象的大小都是1,282字节。好像我错过了一个函数调用,强制将TIFF图像数据写入底层存储(在本例中为MemoryStream)。我已经包含了对Flush()的调用来尝试修复此问题,但它没有任何影响。有谁知道我错过了什么?

using (memoryStream)
{
    memoryStream.Position = 0;
    using (Tiff image = Tiff.ClientOpen("iqdoc", "r", memoryStream, new TiffStream()))
    {
        int totalPages = image.NumberOfDirectories();
        for (int i = 0; i < totalPages; i++)
        {
            image.SetDirectory((short)i);
            using (var ms = new MemoryStream())
            using (Tiff page = Tiff.ClientOpen("page", "w", ms, new TiffStream()))
            {
                var c = new Copier();
                c.m_compression = c.m_defcompression; // THIS WAS MISSING
                if (!c.Copy(image, page) || !page.WriteDirectory())
                    throw new ApplicationException("Failed to extract page from document for presentation.");

                FieldValue[] field = image.GetField(TiffTag.IMAGEWIDTH);
                int width = field[0].ToInt();

                field = image.GetField(TiffTag.IMAGELENGTH);
                int height = field[0].ToInt();

                page.Flush();

                pages.Add(new
                {
                    Height = height,
                    Width = width,
                    PageBytes = Convert.ToBase64String(ms.ToArray()),
                });

                c = null;
            }
        }
    }
}

谢谢!

1 个答案:

答案 0 :(得分:1)

是的,这是可能的。 TiffCP做到了这一点。

您可以使用TiffCP代码并根据您的需要进行调整(更改存储输出的方式)。

您还可以提出其他想法并实施其中一个。

您可能无法在本网站的答案中获得完整的解决方案。

编辑:

您的代码基本上没问题,但只有在Tiff写完代码后才能访问内存流的字节。

不幸的是,TiffDisposeClose方法关闭了内存流。您可以尝试两种方法来克服这个问题:

  • 在访问内存流中的字节之前调用Tiff.WriteDirectory。这个应该没问题,但你可能会在流中获得一个不完整的TIFF。
  • 创建自己的流(基于System.IO.MemoryStream),使用空实现重载Close方法,并使用此流而不是MemoryStream。在处置Tiff之后访问此流中的字节。