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

本文关键字:tiff 拆分 单页 图像 net libtiff | 更新日期: 2023-09-27 18:33:41

我正在尝试使用 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;
            }
        }
    }
}

谢谢!

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

是的,这是可能的。TiffCP就是这样做的。

您可以获取 TiffCP 代码并根据您的需求进行调整(更改它存储输出的方式(。

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

您可能无法在此站点的答案中获得完整的工作解决方案。

编辑:

您的代码基本上没问题,但您应该仅在Tiff完成对内存流的写入后访问内存流的字节。

不幸的是,Tiff关闭了DisposeClose方法中的内存流。您可以尝试两种方法来解决此问题:

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