2016-04-29 7 views
0

Zoomen Rendern einer PDF-Seite in eine CanvasBitmap und Zeichnen dieses Bild auf einem VirtualCanvasControl. Aber wenn ich das Bild zoome, wird das Bild pixelig. Ich habe versucht, nur den Teil darzustellen, der sichtbar ist, aber das scheint nicht zu funktionieren. Was mache ich falsch?Eine gerenderte PDF in VirtualCanvasControl

<ScrollViewer Grid.RowSpan="2" 
        Grid.Row="0" 
        Name="PdfScrollViewer" 
        ZoomMode="Enabled" 
        MaxZoomFactor="4" 
        MinZoomFactor="0.8" 
        HorizontalScrollBarVisibility="Visible" 
        VerticalScrollBarVisibility="Visible" 
        HorizontalAlignment="Stretch" 
        VerticalAlignment="Stretch" 
        BringIntoViewOnFocusChange="False"> 
     <canvas:CanvasVirtualControl x:Name="PageRenderCanvas" RegionsInvalidated="PageRenderCanvas_OnRegionsInvalidated" 
       /> 
    </ScrollViewer> 

The RegionsInvalidated Eventhandler:

private async void PageRenderCanvas_OnRegionsInvalidated(CanvasVirtualControl sender, 
     CanvasRegionsInvalidatedEventArgs args) 
    { 
     PdfPageRenderOptions options = new PdfPageRenderOptions(); 
     options.DestinationWidth = (uint) (PdfScrollViewer.ActualWidth*PdfScrollViewer.ZoomFactor); 
     options.DestinationHeight = (uint) (PdfScrollViewer.ActualHeight*PdfScrollViewer.ZoomFactor); 
     options.SourceRect = args.VisibleRegion; 

     var output = new MemoryStream().AsRandomAccessStream(); 
     await page.RenderToStreamAsync(output, options); // page is the PDFPage 

     var image = await CanvasBitmap.LoadAsync(PageRenderCanvas, output); 

     using (var ds = sender.CreateDrawingSession(args.InvalidatedRegions[0])) 
     { 
      ds.DrawImage(image, args.VisibleRegion); 

      ds.Dispose(); 
     } 

    } 

Antwort

0

Das Bild verpixelt, weil Sie den Zoom auf die gerenderte Bitmap ausführen.
Da es nicht viel Dokumentation zu VirtualCanvasControl und RegionsInvalidated gibt, empfehle ich, das Rendering jedes Mal durchzuführen, wenn sich der Zoom ändert, und nur das gerenderte Bild im Zeichenereignis anzuzeigen.
Dieser Ansatz erzeugt jedoch Speicherprobleme bei großen Zoomstufen. Bei 96dpi für 100% wird eine Briefseite 816 * 1056 Pixel groß sein und ca. 3MB benötigen. Bei einem Zoom von 500% beträgt das Bild 4080 * 5280 Pixel und benötigt etwa 75 MB.

+0

Yeah Ich habe diesen Ansatz bereits abgebrochen, es dauert zu viel Speicher auf Handys. Ich versuche nur den sichtbaren Teil zu rendern, aber es ist auch verschwommen. – Thommy