I'm afraid, there is no a way to read a TIFF file "not into memory". However, I would more or less easily implement the functionality when you have a collections of smaller file, with different resolutions and smaller fragments of the same image, which you could show on screen in any available resolution. This is even pretty simple.
For a simple example, let's consider the following case: you break a big image in M×N fragments, each fragment having number of pixels approximately matching the typical and quite manageable screen size or somewhat more, say 2-6 MPixels. You can easily load 4-5 images at a time. Actually, you will never need to load more than 5 at a time. Let's see: you actually will need M×N + 1 fragments, one more would be about the same size, representing the full image re-sampled down to the same pixel size as all the fragments. You could use it for navigation. Now, if you navigate to some fragment of the source image in maximum resolution, it will be, generally, on the intersection of 4 fragments; therefore, you would newer need to show more than 5 images at a time. You can unload and load images dynamically, never demanding too much memory. In my simple schema, you will have only two levels of resolution: "actual pixels" and "full image".
If you think at this idea, you will see that you can actually show any resolution in between in full screen size on each step, if you take several sets of tiled image fragments of 2-3 intermediate resolutions; and you don't have to have only, say, 5 different resolution levels: you can have any resolution between "actual pixels" and "full image", because when you present fragments on screen, you can also additionally re-sample images on the fly.
The main idea is: you never need to use more bitmap memory then the memory size of one full-resolution screen buffer multiplied by 5, because that no one can see more then one full screen at a time. When you zoom/pan, you load additional bitmaps on the fly and dispose unused ones. Note that the class
System.Drawing.Image
, the base class of
System.Drawing.Bitmap
is
IDisposable
:
http://msdn.microsoft.com/en-us/library/system.drawing.image.aspx[
^].
I hope the technique is clear. You are welcome to develop all the detail. It's not even difficult. If you doubt that it can be fast enough, look at Google maps. With .NET, it actually should be even faster, because you don't require to spend time on network traffic.
Good luck,
—SA