none
PrintDocument列印模糊問題 RRS feed

  • 問題

  • 各位大大,

    小弟有寫一個從winform直接列印TableLayoutPanel的程式,

    是使用e.Graphics.DrawImage來進行列印,

    但是文字的部分,印出來有點模糊,

    在版上有看到有人是使用e.Graphics.DrawString來解決文字模糊的問題,

    但是我是要印整個TableLayoutPanel(裡面包了文字、圖片)

    想請教各位大大,有沒有什麼方法可以解決這個問題呢?

    謝謝!

    2017年5月16日 上午 01:27

所有回覆

  • 你用螢幕拷貝的方式沒辦法,因為螢幕解析度只有 72 ~ 96 DPI ,印表機 600 DPI ,兩者解析度差六倍以上。

    要漂亮就是用報表程式或自行輸出。


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    2017年5月17日 上午 11:33
  • 從 Windows API 裡面來看,螢幕跟印表機的 DPI 是一致的處理方式的,所以概念相同,所以 .Net 裡面都是用 Graphics 處理,這表示後面呼叫 gdiplus 對 hDC 處理方式是一致的。

    你的前提如果是說近年高解析度畫面大增,因此螢幕 DPI 已高於傳統共識 72 ~ 96 DPI ,這樣是合理的,但是也不會發生螢幕解析度高於印表機,所以正確的 uPnP 螢幕擷取時,硬體資訊應該要帶螢幕尺寸。

    以 24 吋螢幕 1920x1080 來算,DPI = 125

    24/25*16=15.36 (透過畢氏定理算螢幕寬幾吋)

    DPI = 1920/15.36=125 (解析度計算方式 點數/吋)

    沒有特殊規格的螢幕,一般 DPI 是低於印表機,600 DPI 的印表機已經很爛了。

    可視大小才可能說成螢幕高於印表機。


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    2017年5月17日 下午 05:53
  • 這個回應回起來很麻煩,不知道該怎樣回比較清楚。

    先把 DPI 跟 Pixel 拆開。

    印表機 DPI 沒爭議就不討論了。

    螢幕的 DPI 是 72 ~ 96 不是我在說的,早期 MSDN 都這麼說,算是從 Win3x 年代下來,但的確,最新的 MSDN 已經把螢幕預設 DPI 改成 96。

    這篇 MSDN blog 在講早期螢幕的 DPI https://blogs.msdn.microsoft.com/fontblog/2005/11/08/where-does-96-dpi-come-from-in-windows/

    這篇是在講 DrawImage 的 DPI 跟縮放,已經跟發問者提的有關,只是這篇只講在螢幕上,沒講到印表機 https://msdn.microsoft.com/zh-tw/library/aa700987(v=vs.71).aspx

    這篇已經在講現在的螢幕高解, DPI 的提升:https://msdn.microsoft.com/en-us/library/windows/desktop/ff684173.aspx

    DPI 的歷史看完後,後面的回應應該是針對來源 Pixel 跟 輸出 Pixel 的關係,這邊特別把 DPI 抽掉是避免跟上面混在一起,反正只要知道輸出 Pixel 很高。

    當 Pixel 數量有差時,就是縮放而已。所以相片印出主要是縮放,跟 DPI 關係要切割,因為圖片來源本身可以包含 DPI ,相片預設沒有,但掃描文件的圖片是有的,如果不管 DPI 的部分,就是縮放,管到 DPI 的部分,除了原尺寸輸出外,還是可能有 DPI 問題,例如 掃描用 300 DPI ,但輸出可以用 600 DPI ,大小不變,這是縮放問題。

    到這裡又扯上一個視覺辨識度,印表機是高解,事實上肉眼是無法分辨太細的點,例如掃描用 200 DPI 原尺寸 600 DPI 輸出看起來也分不太出來。

    至於印表機的 DPI ,看 EPSON 的說明,也定義的很清楚:http://www.epson.com.tw/coretechnology/content/f10bfa86-08d6-4ff1-9981-5cf100f76097

    所以這段很雜,不知道怎樣說清楚。

    回到樓主的目的,由於螢幕的 pixel 低於 印表機的 pixel ,因此會造成放大損失,.Net 1 點變多點的時候,預設是採混色運算,減少邊界感,但是就容易糊掉,可以參考 DrawImage 的引數說明。

    把螢幕往印表機送,沒辦法改善,要改善的話,改成使用報表工具或自己用繪製到 PrintDocument 這個繪布上,沒有放大,就不會模糊掉。


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    2017年5月21日 上午 05:14
  • 這個說法跟上面引用印表機廠商的網頁說明剛好相反。

    印表機廠商在 1999 年 2 月可是很得意的說:「目前EPSON公司所研發出的全球最小墨點已經達到3plpl(為10的負12次方公升),比人的頭髮還細微得多。」


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    2017年5月21日 下午 02:52
  • 上面印表機廠商網頁,有針對 DPI / 墨點 做解釋,要不要看一看?

    例如呼叫 Windows API CreateEnhMetaFile 需要參照的畫布 (DC) hDCRef ,若有印表機,參照 Printer 的 DC 可以得到一個高解析度的畫布,在沒有 Net 新增的 EMF+ 格式前,要能輸出更細緻的向量檔,就要靠 Printer 設成高解 (或虛擬印表機) ,從 Windows API 來看 DC ,印表機跟螢幕是一樣的,只是差在 DPI 所換算出來的 Pixel。

    Windows 內對於產出的畫布有多少 Pixel ,可是印表機比螢幕高多了,這部分也符合印表機廠商的網頁說明。


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    2017年5月22日 下午 12:35