我正在尝试使用 LibTiff.Net 将多页 TIFF 图像拆分为单页 TIFF 图像。
我正在两个系统之间构建一个 TIFF 拆分中介。我将接收多页 TIFF 图像作为流,然后将其拆分为单独的页面 TIFF 图像文件,并将它们作为字节数组列表返回。
我调用了将多页 TIFF 图像作为流返回的 Web 服务。我需要将每个页面提取为单独的 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;
}
}
}
}
谢谢!