mirezus
mirezus

Reputation: 14246

How to open a multi-frame TIFF imageformat image in .NET 2.0?

Image.FromFile(@"path\filename.tif")

or

Image.FromStream(memoryStream)

both produce image objects with only one frame even though the source is a multi-frame TIFF file. How do you load an image file that retains these frames? The tiffs are saved using the Image.SaveAdd methods frame by frame. They work in other viewers but .NET Image methods will not load these frames, only the first.

Does this mean that there is no way to return a multi-frame TIFF from a method where I am passing in a collection of bitmaps to be used as frames?

Upvotes: 17

Views: 33743

Answers (3)

Chris
Chris

Reputation: 120

I was able to handle the multi-frame tiff by using the below method.

Image multiImage = Image.FromFile(sourceFile);

multiImage.Save(destinationFile, tiff, prams);

int pageCount = multiImage.GetFrameCount(FrameDimension.Page);

for (int page = 1; page < pageCount; page++ )
{
    multiImage.SelectActiveFrame(FrameDimension.Page,page);
    multiImage.SaveAdd(dupImage,prams);
}

multiImage.SaveAdd(newPage, prams);
multiImage.Dispose(); 

I have not tried the solution in .net 2.0 but MSDN shows the class members to exist. It did fix my problem in .net 4.5.2.

Upvotes: 3

Adem Canpolat
Adem Canpolat

Reputation: 19

bitmap.Dispose();

After For loop you need to Dispose bitmap. Otherwise you get error "file using other process" when try to use same file in other process.

Upvotes: -1

Ot&#225;vio D&#233;cio
Ot&#225;vio D&#233;cio

Reputation: 74270

Here's what I use:

private List<Image> GetAllPages(string file)
{
    List<Image> images = new List<Image>();
    Bitmap bitmap = (Bitmap)Image.FromFile(file);
    int count = bitmap.GetFrameCount(FrameDimension.Page);
    for (int idx = 0; idx < count; idx++)
    {
        // save each frame to a bytestream
        bitmap.SelectActiveFrame(FrameDimension.Page, idx);
        MemoryStream byteStream = new MemoryStream();
        bitmap.Save(byteStream, ImageFormat.Tiff);

        // and then create a new Image from it
        images.Add(Image.FromStream(byteStream));
    }
    return images;
}

Upvotes: 35

Related Questions