10

我想使用 LibTiff 访问非常大的 TIFF 文件。我需要多个页面和图块之类的功能,因此 LibTiff 似乎是正确的方法。任何人都可以帮助我如何使用 C# 中的 LibTiff 吗?我找到了一些链接(例如包含部分代码的 blog.bee-ee。但我无法获得一个版本。我查看了FreeImage但发现它不合适(图片约为 800 MPixel 8 或 16位灰度-> 800-1600 MByte)大小,我无法在 32 位环境中将其加载到内存中)

我在 C/C++ 方面非常有经验,但在 C# 方面还没有。谁能帮我做一个包装或一些提示?

注意:我需要页面来访问 tiff 中的金字塔平面(多分辨率),以及 256x256 的图块,以便快速访问图像的不同部分而无需立即加载。

[编辑] LibTIFF.NET解决方案对我来说似乎最实用。我现在将它集成到产品开发中,它可能会为我省去很多关于进出托管内存的麻烦。我还没有尝试过“回调”功能,这似乎可以通过 .net 方式很好地解决。感谢您对 stackoverflow 的帮助 [/Edit]

4

3 回答 3

7

你可以试试我们的 LibTiff.Net。它是使用托管 C# 编写的 LibTiff 的免费和开源版本。我们实现的 API 与原来的非常相似。

https://bitmiracle.com/libtiff/

我们刚刚发布了它,所以可能会有错误。但是完整的源代码附带了一些测试,所以最明显的错误应该被修复。

于 2010-01-13T10:11:38.530 回答
4

WIC 支持非常大的图像文件。.NET 框架中有一个很好的包装器:TiffBitmapDecoder。

于 2010-01-11T12:51:07.030 回答
1

我最初的解决方案是为 LibTIFF DLL 使用 C#.NET 包装器。我在libtiff ftp上找到了它。它似乎包含了 LIBTiff 库的所有重要方法。它将内存保存在非托管的 LibTIFF 内存中;这意味着 C# 代码需要意识到这一点,并在需要以安全代码处理数据时复制数据。

我的“瓷砖阅读代码”来测试它读起来像

if (LibTIFF.IsTiled(tiff))
{
    if (LibTIFF.GetField(tiff, (int)TIFFTags.TIFFTAG_TILEWIDTH, out tileWidth) &&
        LibTIFF.GetField(tiff, (int)TIFFTags.TIFFTAG_TILELENGTH, out tileLength))
    {
        uint tiles = 0;
        IntPtr pTile = LibTIFF._malloc((int)(tileLength*tileWidth*bitsPerSample/2));
        for (uint y = 0; y < imageLength; y += tileLength)
        {
            for (uint x = 0; x < imageWidth; x += tileWidth)
            {
                LibTIFF.ReadTile(tiff, pTile, x, y, 0, 0);
                tiles++;
            }
        }                        
        LibTIFF._free(pTile);   
    }
}

不过,我会选择 LibTIFF 的 .NET 端口,但这个解决方案可能对其他人来说是正确的,所以我将它留在 StackOverflow 上。

于 2010-01-13T08:41:47.510 回答