4

我正在尝试找出一种在 .NET 中裁剪大型 TIFF 图像的方法。具体来说,我正在尝试在 GeoTiff 上执行此操作,这是一个允许将地理配准信息嵌入自身的 TIFF。对于那些不熟悉此类数据集的人,它完全符合 TIFF 6.0 并且通常非常庞大;千兆字节范围内的许多倍。

我一直在搞乱 System.Windows.Media.Imaging 命名空间来尝试完成这项任务。但是,要裁剪的 tiff 的大小会导致内存不足错误。谁能指出一些信息,显示如何在不将输入图像读入内存的情况下裁剪图像?

仅供参考 - 我完全知道 GDAL 能够胜任这项任务。但是,在不涉及不必要的细节的情况下,出于多种原因,在我的应用程序中部署 GDAL 不是一种选择,因此我希望使用本机 .NET 类来执行此操作。但是,如果还有其他可用的第 3 方 .NET 库,我会全力以赴。

4

3 回答 3

3

看看libtiff。您想通过扫描线(或条带,如果这是图像的格式)加载图像。显然,您仍然需要足够的内存来保存整个扫描线(或条带),但这比将整个图像加载到内存中更可行。

似乎有一个.NET 版本的库,看起来它是免费和开源的(不像他们的一些其他应用程序)。

于 2011-02-11T04:59:45.610 回答
1

不幸的是,内置的基于 GDI+ 的成像操作(可在其中使用System.DrawingSystem.Drawing.Imaging要求在某些时候将完整图像加载到内存中。这在您的情况下显然是不可行的。

于 2011-02-10T16:00:05.327 回答
1

您不可能将千兆字节范围内的 TIFF 视为“图像”:将其视为磁盘上的文件,或映射到内存中,并对其执行操作,就好像它是数据集一样。

Imaging Namespace 不是为如此大的数据集设计的,它是为处理图片、较小的图像等而设计的。您必须找到 TIFF 操作库或编写自己的例程才能在文件级别工作。我过去曾使用过一个名为“libtiff”的基于 C 的开源库。这可能是一个很好的起点。

(您在编写自己的文件时会遇到一些困难,包括 TIFF 文件可以进行各种压缩 - 如果是岩土工程,那么可能有标准/直接压缩,或者未压缩?在这种情况下,复制内存将是大部分工作- 并保留 TIFF 目录和条目。如果您需要商业选项,我建议您查看 Atalasoft 的 DotImage 库。)

于 2011-02-10T16:01:17.437 回答