嗨我正试图得到一个矩形,当笔很粗时,它完全包围通过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
我会发布图片,但论坛不允许我。
我希望边界矩形也包括笔宽。我使用上面的三角形来演示我只能添加penwidth / 2.
有什么想法吗?
儒略
答案 0 :(得分:0)
如果这足以满足您的需求,您可以将笔的.Alignment
属性设置为Inset
,如下所示:
g.DrawPath(New Pen(New SolidBrush(Color.Black), 20) With {.Alignment = PenAlignment.Inset}, gp)
这基本上告诉笔在任何时候都在路径内部绘制。默认是它在中间绘制自身,这导致边缘的外部宽度取决于边缘的角度。
结果是:
答案 1 :(得分:0)
为了防止其他人像我试图找到解决方案那样挣扎,那么这就是我最终所做的。我放弃了尝试使用某种形式的getbounds方法。
我的解决方案是扫描渲染的位图,而不是根据非透明的像素(渲染图像的背景)计算边界。事实上,我只需要在组合图像上扫描一次,现在只需要几分之一秒来计算“真实”边界。
我使用这篇文章Fit a PictureBox to its non-transparent pixels来实现一个证明这个概念的起点,并给了我一个可以做“getbounds”的区域。然后我换了Work with bitmaps faster in C#的锁定位示例的慢速getpixel方法,然后瞧!
只需将所有代码通过在线c#运行到vb转换器并将其粘贴在一起,以便在不到一个小时内完全正常工作。
我浪费了一小部分时间试图在互联网上找到一个直接在矢量图像上工作的解决方案。
儒略