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