2014-10-04 109 views
0

嗨我試圖得到一個矩形,完全包圍通過GDI +繪製的形狀,當筆很厚時。查找GDI +形狀的邊界

這是我的測試代碼,演示,我剛剛加入到mybase.load來測試..

Dim bmp As New Bitmap(500, 500) 
    Dim g As Graphics = Graphics.FromImage(bmp) 
    g.Clear(Color.Transparent) 
    g.SmoothingMode = SmoothingMode.HighQuality 
    g.PixelOffsetMode = PixelOffsetMode.Default 

    ' Setup Matrix 
    Dim mat As New Matrix 
    mat.Translate(100, 100) 
    g.Transform = mat 

    ' Draw Lines and Fill 
    Dim gp As New GraphicsPath 
    gp.AddLines({New Point(50, 0), New Point(100, 100), New Point(0, 100)}) 
    gp.CloseAllFigures() ' Closes Open Path (ie join back to origin) 
    g.FillPath(New SolidBrush(Color.Beige), gp) 

    ' Add Border to Graphics Path 
    g.DrawPath(New Pen(New SolidBrush(Color.Black), 20), gp) 

    g.DrawRectangle(New Pen(New SolidBrush(Color.Red), 1), Rectangle.Truncate(gp.GetBounds)) 

    ' Tidy Up 
    g.ResetTransform() 
    mat.Dispose() 

    ' Set Picturebox Value 
    PictureBox1.Image = bmp 

我會發布的圖像,但該論壇不讓我。

我想邊界矩形也包括筆寬。我用上面的三角形演示了我不能添加筆寬/ 2。

任何想法?

朱利安

+0

使用GraphicsPath.GetBounds(Matrix,Pen)方法。 – 2014-10-04 14:12:53

+0

您好我正在重溫這並嘗試GraphicsPath.GetBounds(矩陣,筆)方法,但無論我做什麼,我都不能讓它正常工作。當然,它會返回結果,但它們看起來與我期望的三角形稍寬的筆寬不同。有任何想法嗎? – 2015-05-25 12:01:54

回答

0

如果這是足以滿足您的需求,您可以簡單地將筆的.Alignment屬性設置爲Inset像這樣:

g.DrawPath(New Pen(New SolidBrush(Color.Black), 20) With {.Alignment = PenAlignment.Inset}, gp) 

這主要是告訴筆繪製自己的路徑內每時每刻。默認情況是它在中間位置自行繪製,這會導致邊緣外部寬度取決於邊緣角度的情況。

結果是:

enter image description here

+0

謝謝你們。 Jules – 2014-10-05 13:54:48

+0

我最終決定將它留在中間,因爲如果我有對齊中間邊框的重疊對象,那麼我可以更改所有對象的邊框厚度,並且它們仍然正確對齊。我喜歡這兩種解決方案的簡單性,並在我的代碼中的其他地方使用,所以謝謝。 – 2014-10-05 13:58:25

0

萬一別人鬥爭像我一樣,試圖找到一個解決方案,然後這是我最後還是沒買。我放棄了嘗試使用某種形式的getbounds方法。

我的解決方案是掃描渲染的位圖,而不是計算基於不透明像素(我渲染圖像的背景)的邊界。實際上,我只需要在合成圖像上掃描一次,而現在只需要幾分之一秒來計算「真實」範圍。

我使用這篇文章Fit a PictureBox to its non-transparent pixels來實現一個起點,證明了這個概念,並給了我一個區域,我可以做一個「getbounds」。然後,我換出了鎖定比例的緩慢getpixel方法,在Work with bitmaps faster in C#和voila!

只需將所有代碼通過在線c#轉換爲vb轉換器並將其粘貼在一起即可在不到一個小時內完成工作。

花了一小段時間我試圖在互聯網上找到解決方案,直接在矢量圖像上工作。

朱利安