2014-10-04 55 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转换器并将其粘贴在一起即可在不到一个小时内完成工作。

花了一小段时间我试图在互联网上找到解决方案,直接在矢量图像上工作。

朱利安