2009-07-11 6 views
3

Ich versuche, Code zu schreiben, der ein großes Bild (1200 Breite x 475 Höhe) über mehrere Seiten drucken wird.Verwenden von C# zum Drucken großer Bilder über mehrere Seiten

Ich habe versucht, das Bild über drei Rechtecke (durch Teilen der Breite durch drei) und Aufruf von e.Graphics.DrawImage dreimal und das funktioniert nicht.

Wenn ich das große Bild auf einer Seite angeben, funktioniert es, aber wie würde ich das Bild in mehrere Seiten teilen?

Antwort

3

Der Trick besteht darin, jeden Teil des Bildes in eine eigene Seite zu bekommen, und zwar im PrintPage Ereignis der PrintDocument.

Ich denke, dass der einfachste Weg ist, das Bild in separate Bilder aufzuteilen, eins für jede Seite. Ich nehme an, dass Sie das schon handhaben können (vorausgesetzt, Sie versuchen, das Bild zu partitionieren; dasselbe, legen Sie sie einfach auf separate Bilder). Dann schaffen wir die Printdocument-Instanz, haken Sie das Printpage-Ereignis auf, und gehen:

private List<Image> _pages = new List<Image>(); 
private int pageIndex = 0; 

private void PrintImage() 
{ 
    Image source = new Bitmap(@"C:\path\file.jpg"); 
    // split the image into 3 separate images 
    _pages.AddRange(SplitImage(source, 3)); 

    PrintDocument printDocument = new PrintDocument(); 
    printDocument.PrintPage += PrintDocument_PrintPage; 
    PrintPreviewDialog previewDialog = new PrintPreviewDialog(); 
    previewDialog.Document = printDocument; 
    pageIndex = 0; 
    previewDialog.ShowDialog(); 
    // don't forget to detach the event handler when you are done 
    printDocument.PrintPage -= PrintDocument_PrintPage; 
} 

private void PrintDocument_PrintPage(object sender, PrintPageEventArgs e) 
{ 
    // Draw the image for the current page index 
    e.Graphics.DrawImageUnscaled(_pages[pageIndex], 
           e.PageBounds.X, 
           e.PageBounds.Y); 
    // increment page index 
    pageIndex++; 
    // indicate whether there are more pages or not 
    e.HasMorePages = (pageIndex < _pages.Count); 
} 

Hinweis, die Sie benötigen pageindex auf 0 vor dem Drucken des Dokuments wieder zurückgesetzt werden (zum Beispiel, wenn Sie das Dokument drucken möchten nach zeigt die Vorschau).

+0

Ihre Lösung funktionierte auch für mich, ich habe innerhalb der PrintDocument_PrintPage-Methode den Seitenindex auf 0 zurückgesetzt, wenn er innerhalb der PrintDocument_EndPrint-Methode hätte sein sollen ... – coson

+0

Kann jemand wie SplitImage (source, 3) ausführen? –

Verwandte Themen