使用C#中的LibTiff(访问平铺的TIFF图像)

时间:2010-01-11 12:32:41

标签: c# .net libtiff libtiff.net

我想使用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的帮助 [/编辑]

3 个答案:

答案 0 :(得分:6)

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

http://bitmiracle.com/libtiff/

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

答案 1 :(得分:4)

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

答案 2 :(得分: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上。