2009-05-06 5 views
1

Ich versuche, ein mehrseitiges TIFF-Bild in ein mehrseitiges XPS-Dokument umzuwandeln. Das Problem, das ich habe, ist mit dem TiffBitmapDecoder und seinen BitmapFrames.TIFF-Seiten können nicht aus TiffBitmapDecoder.Frames abgerufen werden - alle Frames sind Seite 1

Hier ist der Code:

private static void ToXpsDocument(string imageName, string xpsName) 
{ 
    using (var p = Package.Open(xpsName)) 
    { 
     PackageStore.AddPackage(new Uri("pack://thedocloljk.xps"), p); 
     XpsDocument doc = new XpsDocument(p); 
     var writer = XpsDocument.CreateXpsDocumentWriter(doc); 
     var dec = new TiffBitmapDecoder 
          (new Uri(imageName), 
          BitmapCreateOptions.IgnoreImageCache, 
          BitmapCacheOption.None); 

     var fd = new FixedDocument(); 
     foreach (var frame in dec.Frames) 
     { 
      var image = new System.Windows.Controls.Image(); 
      image.Source = frame; 
      var fp = new FixedPage(); 
      fp.Children.Add(image); 
      fp.Width = frame.Width; 
      fp.Height = frame.Height; 
      var pc = new PageContent(); 
      (pc as IAddChild).AddChild(fp); 
      fd.Pages.Add(pc); 
     } 
     writer.Write(fd); 
     p.Flush(); 
     p.Close(); 
     PackageStore.RemovePackage(new Uri("pack://thedocloljk.xps")); 
    } 
} 

Das mit der richtigen Anzahl der Seiten in einem XPS-Ergebnisse. Jede Seite ist jedoch eine Replik der ersten Seite des TIFF. In der Tat, wenn ich ein einzelnes Bild herauspicke (z. B. dec.Frames [4]) und es auf die Festplatte schreibe, sieht es wie die erste Seite aus.

Was zum Teufel mache ich hier falsch? Sind die Frames nicht die einzelnen Seiten des Bildes? Wie kann ich sie rausholen und mit ihnen arbeiten?

Antwort

1

Versuchen Sie den folgenden Code verwenden (die kommentierten Zeilen sind anders als Ihre Version):

foreach (var frameSource in dec.Frames) // note this line 
{ 
    var frame = BitmapFrame.Create(frameSource); // and this line 
    var image = new System.Windows.Controls.Image(); 
    image.Source = frame; 
    var fp = new FixedPage(); 
    fp.Children.Add(image); 
    fp.Width = frame.Width; 
    fp.Height = frame.Height; 
    var pc = new PageContent(); 
    (pc as IAddChild).AddChild(fp); 
    fd.Pages.Add(pc); 
} 
+0

Wird dies überprüfen. – Will

Verwandte Themen