2013-02-22 35 views
4

語言: VB .NET 2010贏形式印刷/圖形問題

範圍: 我已經開發了旨在打印自定義標籤斑馬打印機標籤打印程序。當我試圖將整個標籤作爲圖像打印時,我的打印機清晰度出現問題,因此我試圖將標籤中的所有文本存儲到數組中,清除標籤,將剩餘圖像發送到打印機,以及根據存儲的數組覆蓋新文本。此結果旨在將文本發送到打印機而不是圖像。

問題: 生成的標籤對於文本非常清晰,因爲我需要它但是我的打印方法有對齊問題。對於測試,我將顯示的原始圖像與頂部的疊加文本一起顯示,它們應該在合理範圍內完全對齊或關閉。當這樣做的結果是他們沒有對齊。

測試:

Dim g2 As Graphics 
    g2 = Form1.PictureBox2.CreateGraphics 
    g2.CompositingQuality = Drawing2D.CompositingQuality.HighQuality 
    g2.SmoothingMode = Drawing2D.SmoothingMode.HighQuality 
    g2.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic 
    g2.Clear(Color.White) 

    g2.DrawImage(largeimage, New Point(0, 0)) 

    Dim myBrush As Brush 
    Dim i As Integer = 0 
    Do Until i = label_array.Count - 1 
     myBrush = New SolidBrush(label_array(i).ForeColor) 
     g2.DrawString(label_array(i).Text, label_array(i).Font, myBrush, label_array(i).Location) 
     i = i + 1 
    Loop 

在印刷方法我用上述方法,以輸出疊加和圖像到一個圖片框。當這樣做不過它的工作原理,...

e.Graphics.CompositingQuality = Drawing2D.CompositingQuality.HighQuality 
    e.Graphics.SmoothingMode = Drawing2D.SmoothingMode.HighQuality 
    e.Graphics.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic 
    e.Graphics.Clear(Color.White) 

    e.Graphics.DrawImage(largeimage, New Point(0, 0)) 

    i = 0 
    Do Until i = label_array.Count - 1 
     myBrush = New SolidBrush(label_array(i).ForeColor) 
     e.Graphics.DrawString(label_array(i).Text, label_array(i).Font, myBrush, label_array(i).Location) 
     i = i + 1 
    Loop 

它..doing上文不對結果中顯示的打印圖形...

任何想法,歡迎我會嘗試任何事情。我猜測印刷圖形是從我不知道的正常圖形中做些額外的事情。


我沒有注意到TextRenderer.DrawText與DrawString相比改進了結果。使用這種但是當結果似乎通過某種未知的比例因子從原來的縮放...

下面是對上面所產生的疊加原: enter image description here

+0

在創建新筆刷之前,不要忘記處理舊筆刷。 – ja72 2013-02-25 16:24:02

+0

請注意,「矩形」的打印始終從屏幕上的「(0,0)」開始,而不是在打印機上開始。檢查打印矩形'.Left'和'.Top'屬性並相應地偏移文本。 – ja72 2013-02-25 16:25:58

+0

保證金邊界=(100,100)和頁面邊界=(0,0),所以我沒有看到真正的相關性。 – 2013-02-25 17:41:18

回答

2

您正在重新發現Graphics的一個衆所周知的問題。DrawString(),它不是準確的。這個問題的最生動的演示就是這個樣的WinForms形式:

public partial class Form1 : Form { 
    public Form1() { 
     InitializeComponent(); 
    } 
    protected override void OnPaint(PaintEventArgs e) { 
     e.Graphics.DrawString("Hiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii", 
      this.Font, Brushes.Black, 0, 0); 
    } 
} 

,看起來像這樣:

enter image description here

的魔術沒有量過要得到你的部分重疊字符串,其中我突然改變的字母之間的間距。 GDI +是微軟在分辨率獨立文本渲染方面的第一次嘗試,並且效果不佳。這是一個很好的公司,WPF是第二次嘗試,它爲模糊輸出贏得了很多聲望。以類似於.NET 2.0 for Winforms中修復的方式解決的方法,您應始終使用TextRenderer.DrawText()將文本呈現到窗口。它不會嘗試使渲染文本平滑地縮放,它總是傾向於適合像素網格。與WPF的理想 vs 顯示渲染模式,added in .NET 4同樣的事情。

您的方法還存在其他一些問題,文本呈現的方式顯然不適用於打印機。您可以看到,當您放大時可以看到像素,SysInternals的ZoomIt實用程序對此很有幫助。我放大了字母a在你右手邊的圖形:

enter image description here

注意偏紅偏藍像素的字形的邊緣。這是一種稱爲ClearType的抗鋸齒技術,它增強了LCD顯示器的感知分辨率。它只適用於LCD面板,它不是而不是在不具有相同條紋圖案的打印機上工作。在紙上,這封信會看起來模糊,有一條彩色的邊緣。儘管它在Zebra打印機上並不是很差,因爲它不支持彩色打印。

這些是特定於將文本呈現給監視器的工件,具有相當差的分辨率的設備。像素網格擬合和ClearType是使文本看起來不錯的技巧。典型的顯示器每英寸不超過約120個像素。儘管蘋果推出「視網膜」顯示器後終於有所改善。一家公司在高分辨率顯示器上擁有股份,他們傳統上使用文字in "ideal" mode

這些渲染技巧是完全不適合打印機,具有更高分辨率的設備。每英寸600像素是典型的,比顯示器輕鬆5倍。通過將繪圖箱繪製到打印機上,您將生效浪費直接繪製到打印機時所獲得的改進。他們的差異非常顯着,用肉眼很容易看到。當您以600 dpi的速度渲染文字時,文字看起來更漂亮更清晰。最初爲120dpi渲染併爲打印機放大的文本看起來很「粗糙」和粗糙。

始終使用PrintDocument類來繪製到打印機。

1

很久以前我寫了一份申請用於將標籤打印到Zebra打印機,所以也許我可以提供幫助。回到當天,我們只有ZPL2 API,只有印刷的文字和簡單的圖形,沒有這個圖像的東西。無論如何...

我的懷疑是這是一個縮放問題。這可能可以解釋爲什麼你的原始圖像是模糊的 - 也許打印機會自動嘗試縮放以適應標籤,並且做得不好?當然,這將解釋上面顯示的結果標籤。

上面的代碼讓我想起了你如何獲得Graphics對象。一個來自圖片框;另一個大概來自打印機。請記住,Graphics對象是依賴於設備的。也就是說,它的屬性和打印方式取決於您是打印到特定的控件(不同的控件可以有不同的縮放比例)還是打印到特定的打印機。

您是否嘗試過使用您現有的代碼打印到激光打印機?看到結果可能很有趣。另請參閱圖形屬性,如ScaleTransform。

+0

所以我假設你正在談論TextRenderer.DrawText方法,並試圖檢查打印機圖形比例的規模?我會嘗試併發布結果。 – 2013-03-01 18:53:19