尝试在Winform应用程序中显示大(2 GB)Tiff图像的一部分

时间:2011-12-20 16:21:12

标签: c# .net winforms image tiff

这是可能的还是我必须使用WPF。我是Winforms的新手并创建了几个简单的应用程序,现在我需要读取一个TIFF文件,然后显示它的一个子部分......

我尝试过这样的事情:

Graphics g = e.Graphics;
Bitmap b = new Bitmap(Image.FromFile(@"W:\ILHSR_Merged_2011\compressed\overviews\ILHSR11_0405-101-1.tif"));
g.DrawImage(b, 10, 10, 350, 300);

但我的内存异常。有人能指出我的意见,或者这只是应该在WPF中开发的内容。

2 个答案:

答案 0 :(得分:4)

我认为您需要使用libTiff实现自己的TIFF加载程序。

TIFF图像格式允许将图像数据存储在图块中。 LibTiff允许您加载单个图块:这样您就可以只显示图像的一部分(不解码整个TIFF!,这可能具有令人望而却步的尺寸)。

不幸的是,我不认为.NET映像支持TIFF功能。我的建议是将libTiff包装在用C ++ / CLI编写的库中,并将其集成到您的应用程序中。

(正当评论:如果一些现有的库已经包装了libTiff,并且它的界面与你的应用程序很好地匹配,那就更好了)

答案 1 :(得分:2)

如果您需要显示部件,请考虑使用平铺的Tif文件,甚至可能使用图像金字塔(有关如何创建/使用它们的背景信息,请参阅TIF pyramid)tif文件。所有这些都可以通过LibTiff和LibTiff.NET

来阅读

当然,这取决于您需要多久进行一次。我的经验是,使用32位Windows版本无法正确显示非常大的位图,除非文件本身是平铺的。我为LibTiff.NET做了一个包装器,它允许Tile访问非平铺(未压缩或基于行)的文件。当然,访问速度慢;你需要读取显示的整行。对于千兆像素图像,响应时间仍然合理。

上一篇文章/评论中提到的BitMiracle LibTiff.NET很有用:见How to implement pan/zoom on gigapixel bitmaps?How to implement pan/zoom on gigapixel bitmaps?;它是LibTiff的本地c#实现,我发现它比包装类更容易处理(因为在c#app中没有非托管内存块可以处理)。

[编辑]添加了TIF金字塔图像文档[/ Edit]

的链接