2016-02-19 61 views
1

我打算使用Texture Brush繪製相同厚度的線條。 但是線條的厚度看起來不規則。當使用TextureBrush時,線條看起來不規則厚度

如果可以的話,我想不要以0.1mm爲單位停止繪製。 因爲用戶的代碼差不多完成了。

如果您有想法,我會很感激。

The lines in display

//Brush User's Code 
    private void pictureBox1_Paint(object sender, PaintEventArgs e) 
    { 
     // I need to draw by 0.1mm unit like CAD. 
     e.Graphics.PageUnit = GraphicsUnit.Millimeter; 
     e.Graphics.PageScale = 0.1F; 

     Point leftTop = new Point(2, 2); 
     using(TextureBrush aBrush = myBrush()){ 
      aBrush.TranslateTransform(leftTop.X, leftTop.Y); 
      e.Graphics.FillRectangle(aBrush, leftTop.X,leftTop.Y, 90, 1000); 
     } 
    } 

    //BrushMaker Code 
    private TextureBrush myBrush() 
    { 

     Bitmap bitmapCanvas = new Bitmap(20, 10); 
     Graphics g = Graphics.FromImage(bitmapCanvas); 

     Pen myPen = new Pen(Brushes.Black, 2F); 
     g.DrawLine(myPen, 2, 5, 18, 5); 

     var brush = new TextureBrush(bitmapCanvas); 

     myPen.Dispose(); 
     g.Dispose(); 
     bitmapCanvas.Dispose(); 

     return brush; 
    } 

回答

1

繪畫是模糊的,因爲e.Graphics.PageScale不同於1.當屏幕上繪製你真的只能使用GraphicsUnit.Pixel和所有其他值必須轉換爲像素。由於約定是所有顯示器每英寸有96個像素,並且根據定義1英寸== 25.4毫米,所以我們有0.1毫米== 0.1毫米* 96(像素/英寸)*(1英寸/25.4毫米) )== 0.378像素(大約)。讓我們以0.4個像素爲基本單位。通過將它們與0.4相乘來轉換代碼中的所有數字。這是Point(1, 1)而不是Point(2, 2)90, 1000變成36, 400Bitmap(20, 10)現在是Bitmap(8, 4)2F2, 5, 18, 5變成1F1, 2, 7, 2

畢竟這張圖片不會再模糊了。您支付的價格是0.4不完全是0.378(實際上是0.3779527559 ...),所以,一切都會顯示5.5%,但沒有人會注意到這一點。

+0

我建議使用'e.Graphics.DpiX/Y;'而不是假設96dpi。除此之外:是的,我們不能指望當使用像素以外的圖形單位時,10像素將始終適合pixelgrid .. – TaW

+0

謝謝您,Dialecticus和TaW。我明白爲什麼我的代碼繪製模糊的線條。我打算讓我的代碼可以應用屏幕和打印。我可能需要更正我的代碼。我已經寫了很多代碼,尤其是刷用戶代碼。這可能是一項艱苦的工作。 我很感謝你的回答。我學到了很多。 – AYi

+0

如果您對答案感到滿意,請考慮考慮[接受](http://stackoverflow.com/help/accepted-answer)它..! - 我發現你從來沒有這樣做過:在答案的選票下面,點擊左上角的(不可見)複選標記,然後單擊它!它變成了綠色,並獲得了作者和你的一點名聲。 – TaW