我想使用libtiff访问非常大的TIFF文件。我需要像多个页面和瓷砖这样的功能,因此Libtiff似乎是正确的方法。谁能帮助我如何使用C#的libtiff?我找到了一些链接(喜欢 Blog.Bee-ee 其中包含部分代码。但是我没有得到一个版本。我看了看 免费图像 但是发现它不合适(图片大约是800 mpixel 8或16位灰度 - > 800-1600 mbyte),我无法在32位环境中加载内存中)

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

注意:我需要页面来访问TIFF中的金字塔平面(多分辨率),而256x256的瓷砖则可以快速访问图像的不同部分而无需一次加载。

编辑 libtiff.net 解决方案对我来说似乎是最实用的。我现在正在将其集成到产品开发中,它可以从托管内存中/退出托管中为我节省很多头痛。我尚未尝试过“回调”功能,似乎以.NET方式很好地求解。感谢您在Stackoverflow上的帮助[/edit

有帮助吗?

解决方案

您可以尝试我们的libtiff.net。它是使用托管C#编写的LIBTIFF的免费开源版本。我们实施的API与原始的API保持非常相似。

http://bitmiracle.com/libtiff/

我们刚刚发布了它,因此可能有错误。但是完整的源代码带有许多测试,因此应修复大多数明显的错误。

其他提示

WIC为非常大的图像文件提供了支持。 .NET框架中有一个不错的包装器:Tiffbitmapdecoder。

我最初的解决方案是为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);   
    }
}

我会选择.NET端口的Libtiff港口,但是此解决方案可能是其他人的正确方法,因此我将其留在Stackoverflow上。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top