裁剪大型TIFF图像.NET无需将图像读入内存

时间:2011-02-10 15:55:28

标签: .net image-processing geotiff

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

我一直在使用System.Windows.Media.Imaging命名空间来尝试完成此任务。但是,要裁剪的tiff的大小会导致内存不足错误。任何人都可以向我指出一些信息,显示如何裁剪图像而不在开始时将输入图像读入内存吗?

仅供参考 - 我完全清楚GDAL能胜任这项任务。但是,在没有得到不必要的细节的情况下,由于多种原因,在此时部署GDAL并不是一种选择,因此我希望使用本机.NET类来实现这一点。但是,如果有其他第三方.NET库可以使用,我会全力以赴。

3 个答案:

答案 0 :(得分:3)

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

似乎有一个.NET version of the library,它看起来像是免费和开源的(与其他一些应用程序不同)。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

你不应该考虑gigabyte范围内的TIFF和'image':将它视为磁盘上的文件,或映射到内存中,并对其执行操作,就像它是一个数据集一样。

“成像命名空间”不适用于此类大型数据集,而是用于处理图片,较小的图像等。您必须找到TIFF操作库或编写自己的例程才能在文件级工作。有一个开源的基于C的库,名为'libtiff',我以前曾与之合作过;这可能是一个很好的起点。

(你自己编写自己的一些困难包括TIFF文件可以进行各种压缩这一事实 - 如果它是岩土工程,那么可能是标准/直接压缩,或者它是未压缩的?在这种情况下,复制内存将是最常见的工作 - 并保留TIFF目录和条目。如果你是商业选项,我建议你去看看Atalasoft的DotImage库。)