2008-12-30 6 views
9
Image.FromFile(@"path\filename.tif") 

oderWie öffnet man ein Multi-Frame-TIFF-Bildformat in .NET 2.0?

Image.FromStream(memoryStream) 

produzieren beiden Bildobjekte mit nur einem Rahmen, obwohl die Quelle eine Multi-Frame-TIFF-Datei. Wie lädst du eine Bilddatei, die diese Frames enthält? Die Tiffs werden mit den Image.SaveAdd-Methoden Bild für Bild gespeichert. Sie arbeiten in anderen Viewern, aber .NET Image-Methoden laden diese Frames nicht, nur die ersten.

Bedeutet dies, dass es keine Möglichkeit gibt, ein TIFF mit mehreren Frames von einer Methode zurückzugeben, bei der ich eine Sammlung von Bitmaps übergebe, die als Frames verwendet werden?

Antwort

22

Hier ist, was ich benutze:

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; 
} 
+0

Bedeutet dies, dass es keine Möglichkeit gibt, ein TIFF mit mehreren Frames von einer Methode zurückzugeben, bei der ich eine Sammlung von Bitmaps übergebe, die als Frames verwendet werden? – mirezus

+1

Ziemlich viel ja - Sie müssen daran denken, dass in einem Multiframe-TIFF jeder Frame seine eigenen Kodierungsoptionen (Komprimierung, Farbe, Qualität) haben kann. Bitmaps auf der anderen Seite sind viel einfachere Tiere. –

0

Bitmap.Dispose();

Nach der For-Schleife müssen Sie Bitmap entsorgen. Andernfalls erhalten Sie den Fehler "Datei mit anderem Prozess", wenn Sie versuchen, dieselbe Datei in einem anderen Prozess zu verwenden.

1

Ich war in der Lage, die Multi-Frame-Tiff mit der folgenden Methode zu behandeln.

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(); 

Ich habe nicht die Lösung in .net 2.0 versucht, aber MSDN zeigt die Klassenmitglieder zu existieren. Es hat mein Problem in .net 4.5.2 behoben.