2009-06-18 7 views
0

J'essaye d'imprimer un fichier JPEG que je référence en utilisant un objet Uri et j'ai quelques difficultés. J'ai trouvé que pendant que l'image était imprimée, elle a été légèrement recadrée et retournée et mise en miroir. Je devine que la récolte a été causée par une taille qui n'a pas été réglée correctement, mais je ne sais pas pourquoi elle est retournée et tournée. En supposant qu'il s'agissait d'une bizarrerie naturelle, j'ai tenté de résoudre le problème en appliquant une transformation à l'objet drawingContext mais cela entraîne l'impression d'une page vierge. Voici mon code:Comment imprimer une image à partir d'un Uri?

public void Print(List<Uri> ListToBePrinted) 
{ 
    XpsDocumentWriter writer = 
     PrintQueue.CreateXpsDocumentWriter(this.SelectedPrinter.PrintQueue); 

    PrintCapabilities printerCapabilities = 
     this.SelectedPrinter.PrintQueue.GetPrintCapabilities(); 

    Size PageSize = 
     new Size(printerCapabilities.PageImageableArea.ExtentWidth, 
       printerCapabilities.PageImageableArea.ExtentHeight); 

    foreach (Uri aUri in ListToBePrinted) 
    { 
     BitmapImage anImage = new BitmapImage(aUri); 

     //create new visual which would be initialized by image 
     DrawingVisual drawingVisual = new DrawingVisual(); 

     //create a drawing context so that image can be rendered to print 
     DrawingContext drawingContext = drawingVisual.RenderOpen(); 

     // Flips along X and Y axis (flips and mirrors) 
     drawingContext.PushTransform(new ScaleTransform(-1, -1)); 

     drawingContext.DrawImage(anImage, new Rect(PageSize)); 

     drawingContext.Close(); 

     writer.Write(drawingVisual); 
    } 
} 

Toute aide serait grandement appréciée - merci!

Répondre

2

Voici ce que j'ai fini avec:

public void Print(List<Uri> ListToBePrinted) 
{ 
    XpsDocumentWriter writer = 
     PrintQueue.CreateXpsDocumentWriter(this.SelectedPrinter.PrintQueue); 

    PrintCapabilities printerCapabilities = 
     this.SelectedPrinter.PrintQueue.GetPrintCapabilities(); 

    Size PrintableImageSize = 
     new Size(printerCapabilities.PageImageableArea.ExtentWidth, 
       printerCapabilities.PageImageableArea.ExtentHeight); 

    foreach (Uri aUri in ListToBePrinted) 
    { 
     DrawingVisual drawVisual = new DrawingVisual(); 

     ImageBrush imageBrush = new ImageBrush(); 
     imageBrush.ImageSource = new BitmapImage(aUri); 
     imageBrush.Stretch = Stretch.Fill; 
     imageBrush.TileMode = TileMode.None; 
     imageBrush.AlignmentX = AlignmentX.Center; 
     imageBrush.AlignmentY = AlignmentY.Center; 

     using (DrawingContext drawingContext = drawVisual.RenderOpen()) 
     { 
      // Flips along X and Y axis (flips and mirrors) 
      drawingContext.PushTransform(new ScaleTransform(-1, 1, PrintableImageSize.Width/2, PrintableImageSize.Height/2)); 
      drawingContext.PushTransform(new RotateTransform(180, PrintableImageSize.Width/2, PrintableImageSize.Height/2)); // Rotates 180 degree 

      drawingContext.DrawRectangle(imageBrush, null, new Rect(25, -25, PrintableImageSize.Width, PrintableImageSize.Height)); 
     } 

     writer.Write(drawVisual); 
    } 
} 

L'image est un peu floue, mais est certainement acceptable. Je ne suis toujours pas sûr de savoir pourquoi mon image devait être retournée ou reflétée.

0

Pouvez-vous faire quelque chose comme:

BitmapImage anImage = new BitmapImage(aUri); 

Image image = new Image(); 
image.BeginInit(); 
image.Source = anImage; 
image.EndInit(); 
image.Measure(PageSize); 
image.InvalidateVisual(); 

Ensuite, il suffit d'imprimer l'objet d'image car elle dérive à partir de Visual ... Vous devez appeler InvalidateVisual afin que OnRender sera appelée, si vous l'avez pas entraînerait une image vide ...

+0

J'ai tenté de l'implémenter mais j'ai créé une image vide (avec ou sans image.InvalidateVisual()). – Joel

Questions connexes