C# 圖片打印雜談


日常開頭水一下,看了下上次博客,一年零八天了,嘖嘖,奢侈。

最近這個工作挺滿意的,是我想要的發展方向,后續要做機器學習,現在得先把公司之前堆積的問題解決了。

談人生到此結束,還是說正題吧。(感覺這標題吸引不了人啊)

 

 

打印:PrintDocument

環境:WPF and Winform

要求:排版並打印圖片

之前一直不明白很多參數的問題,現在想清楚了,隨手記錄一下。

WPF暫放一邊,把winform先解決了,跟百度爛大街的一樣是 PrintPage事件Graphics繪制來打印的。其它部分參考

https://www.cnblogs.com/hsiang/p/6921817.html

首先用Graphics繪制一直不明白的是該怎么繪制,紙張的大小是多少,怎么樣才能按照指定尺寸打印。

//我們先聊聊紙張大小,看紙張大小可以在開始文件打印
  PrintDocument.Print(); 
並選好打印機后,在 PrintPage事件里繪制要打印的數據
private void pdControl_PrintPage(object sender, PrintPageEventArgs e)
{
    var printDocument = (PrintDocument)sender;
    //紙張的高和寬
    var paper_h = printDocument.DefaultPageSettings.PaperSize.Height;
    var paper_w = printDocument.DefaultPageSettings.PaperSize.Width;
}

然而知道高和寬但不知道單位啊,這高和寬到底是像素還是英寸還是其它的什么鬼。

在實例化new PaperSize就看得到注釋:

百分之一英寸為單位

 這樣第一個問題就解決了,紙張的大小是 printDocument.DefaultPageSettings.PaperSize,並且單位是百分之一英寸。

不過不要太相信這個,比如我要打印的圖片是6寸的(特地量了),但給出是尺寸寬多了0.15In,高多了0.13In。好歹win自帶的PDF打印A4紙也就相差0.002以下好吧。這個為什么有誤差待大神解釋。

 

那么第二個問題(第三個):該怎么繪制才能按照指定尺寸打印

既然我們知道了打印的范圍也就避免了繪制超出紙張。那么我們就要繪制內容了,咱這只講圖片,其它的也差不多。

我做的是根據圖片的大小鋪滿整個打印紙。 

   //我們先建個類,來記錄要圖片大小及紙張大小
//這個類只是方便調試轉換度量單位,實際應用只選一種計算單位就行了 class PrintUnit {
     //圖片大小,這里圖片其實是一寸的照片
public int unit_w = 259; public int unit_h = 377;
     //紙張大小300dpi 6*300 4*300
public PaperSize paperSize = new PaperSize("A6", 1800, 1200);
     //度量單位
private GraphicsUnit unit = GraphicsUnit.Pixel; public GraphicsUnit Unit { get => unit; set { unit = value;
          //如果度量單位為毫米
if (unit == GraphicsUnit.Millimeter) {
            //具體換算為 1200/300*25.4 約等於 102
  paperSize.Height
= 102; paperSize.Width = 152 ;
unit_w
= 22; unit_h = 32; } } } }

 

然后在 PrintPage事件里得到計算打印紙可以鋪滿多少圖片

            PrintUnit printUnit = new PrintUnit();
       g.PageUnit = printUnit.Unit;
       column = printUnit.paperSize.Width / printUnit.unit_w; row = printUnit.paperSize.Height / printUnit.unit_h; for (int i = 0; i < row; i++) { for (int j = 0; j < column; j++) { //g.DrawImage( // Resources._1, // new Rectangle(j * printUnit.unit_w, i * printUnit.unit_h, printUnit.unit_w, printUnit.unit_h), // new Rectangle(0, 0, Resources._1.Width, Resources._1.Height), // g.PageUnit); g.DrawImage(Resources._1, j * printUnit.unit_w, i * printUnit.unit_h, printUnit.unit_w, printUnit.unit_h); } }

  有趣的是在DrawImage(Image image, Rectangle destRect, Rectangle srcRect, GraphicsUnit srcUnit);的重載方法里圖片有誤差,原因不明。

 有點亂了,來強行解釋一波。

在打印事件里PrintPageEventArgs.PageUnit 是設置度量單位,就是你要繪制的單位是按照像素還是毫米或其它,默認是百分之一英寸。

//比如你要打印A4紙210mm×297mm ,打印PrintPage事件里設置度量單位為Millimeter
g.PageUnit=GraphicsUnit.Millimeter;
//鋪滿整個A4紙
g.DrawImage(image, 0, 0, 210, 297);

 就是這么簡單,不過不建議用毫米為單位,因為這樣圖片容易誤差,這是因為繪制時會將毫米轉換成像素。

很明顯用毫米來繪制時會有間隙

 

 懶得排版,事多,溜了溜了。

 

 

 

 前方高能提醒,代碼很亂,不用謝。

 https://files.cnblogs.com/files/zlyxm/DemoPrint_zlyxm.rar

  

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM