PaperlessEnvironments
asked on
How to Load Single Page From .tif file.
I am currently trying to write a .Tif image viewer in .NET and am running into problems with loading individual pages from the file.
Current Issues/Comments:
1) I know how to load an image from disk using the System.Drawing.Image.FromF ile funciton. From there, I can set the Active frame of the image to get to the specific pages - however, this method means I have to load the entire image before traversing the pages. What I want is to just load say, page 2 from a file without having to load the entire file into memory first.
2) I'm currently using .NET. I know this may not be the best solution. If you know of a way for me to do it in another language please speak up.
3) One of my requirements here is that I either must write this from scratch or use a completely royalty free (for commercial) third party tool.
So to summarize, is there a way to load a single page from a .tif file? Idealy, I would assume I need to read the file into a stream, seek to the appropriate place and create the image (page) from that subset of the stream.
Please help.
Current Issues/Comments:
1) I know how to load an image from disk using the System.Drawing.Image.FromF
2) I'm currently using .NET. I know this may not be the best solution. If you know of a way for me to do it in another language please speak up.
3) One of my requirements here is that I either must write this from scratch or use a completely royalty free (for commercial) third party tool.
So to summarize, is there a way to load a single page from a .tif file? Idealy, I would assume I need to read the file into a stream, seek to the appropriate place and create the image (page) from that subset of the stream.
Please help.
ASKER
This code is pretty helpful but not exactly what I'm looking for. In his examples he is still loading the Image using the FromFile method.. for which my understanding is that this loads the entire image into memory.
Does anyone know of a way to only read in specific pages of a file. Maybe by somehow reading the header and then seeking to the position of the page in the file??
Does anyone know of a way to only read in specific pages of a file. Maybe by somehow reading the header and then seeking to the position of the page in the file??
ASKER CERTIFIED SOLUTION
membership
Create a free account to see this answer
Signing up is free and takes 30 seconds. No credit card required.
ASKER
OK, the TiffBitmapEncoder/TiffBitm apDecoder classes are awesome.
Here is what I'm showing in testing:
I have an 80 page tif file where I want to save out page 50 to a separate file...
Using GDI+ it takes 1.01 seconds
Using WPF it takes only 0.09 seconds
MUCH FASTER!!
Now for me to scrap GDI+ completely I need to figure out how to insert/delete pages from the source image. The code below is what I'm working with so far.. this is slow and prone to OOM error... there's got to be a better way. Any ideas?
Here is what I'm showing in testing:
I have an 80 page tif file where I want to save out page 50 to a separate file...
Using GDI+ it takes 1.01 seconds
Using WPF it takes only 0.09 seconds
MUCH FASTER!!
Now for me to scrap GDI+ completely I need to figure out how to insert/delete pages from the source image. The code below is what I'm working with so far.. this is slow and prone to OOM error... there's got to be a better way. Any ideas?
Dim imageStreamSource As New FileStream(FileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)
Dim decoder As New TiffBitmapDecoder(imageStreamSource, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default)
Dim encoder As New TiffBitmapEncoder()
For i As Integer = 0 To decoder.Frames.Count - 1
encoder.Frames.Add(BitmapFrame.Create(CType(decoder.Frames(i), BitmapSource)))
Next
imageStreamSource.Close()
Dim stream As New FileStream(FileName, FileMode.Open)
Dim sm As New System.IO.MemoryStream
ImageToInsert.Save(sm, System.Drawing.Imaging.ImageFormat.Tiff)
encoder.Frames.Insert(2, BitmapFrame.Create(sm))
encoder.Save(stream)
stream.Close()
sm.Close()
It appears to be possible to create a BitmapSource without using a MemoryStream object.
http://stackoverflow.com/questions/94456/load-a-wpf-bitmapimage-from-a-system-drawing-bitmap
http://stackoverflow.com/questions/94456/load-a-wpf-bitmapimage-from-a-system-drawing-bitmap
http://kseesharp.blogspot.com/2007/12/class-for-tiff-manipulation.html