在图像的非透明部分内绘制边框

时间:2012-05-30 16:56:53

标签: .net gdi+ graphicspath

这个线程几乎是我需要的: Creating a GraphicsPath from a semi-transparent bitmap

但是他正在绘制图像周围的轮廓 - 我需要在图像中间绘制一个像素。基本上我正在尝试画一个“焦点矩形”(除了它不是一个矩形) 结果需要以GraphicsPath的形式存在,所以我可以将它放到我当前的代码中。

私有函数GetImagePath(img as Image)为GraphicsPath ... 结束功能

[编辑] 好的,首先我甚至无法从其他帖子中获取代码。我一直在这条线上超出范围:

* byte alpha = originalBytes [y * bitmapData.Stride + 4 * x + 3]; *

如果它甚至首先超过其他东西。很多时候,它从第一个循环中找不到非透明点 - 当大部分图像不透明时。

最新的问题是它创建了一个没有任何意义的点列表。图像是68x68我的点数列表有点像290x21甚至更疯狂的像2316x-15

这是我的原始图片:

[不会让我上传因为新的]

它是70x70按钮的背景图像 - 如果这很重要的话。

1 个答案:

答案 0 :(得分:1)

我认为要使用链接中提供的例程,从中获取输出,并在其周围添加自己的包装器,修改按所需几个像素推送它的路径。您甚至可以在输入参数中移动像素数量,以便您可以使用它。

否则,您可以将第二遍直接添加到提供的例程中。无论哪种方式,我认为这是一个2通过的方法。您需要找到对象的外部边界,即提供的内部边界。然后你需要自己在路径上移动,理解路径的导数,这样你就可以垂直于你正在看的当前点的导数移动你的路径。你还必须从外面识别内部(即移动线的方向)。

算法可能看起来像这样(记住算法):

Create New List of Points for the new line

For all points i in 0 to (n-2) (points in original point list)
    // Get a New point in between
    float xNew = (x(i) + x(i + 1) ) / 2
    float yNew = (y(i) + y(i + 1) ) / 2

    // Need to figure out how much to move in X and in Y for each (pixel) move along
    // the perpendicular slope line, remember a^2 + b^2 = c^2, we have a and b
    float a = y(i + 1) - y(i)
    float b = x(i + 1) - x(i)
    float c = sqrt( (a * a) + (b * b) )

    // c being the hypotenus is always larger than a and b.
    // Lets Unitize the a and b elements
    a = a / c
    b = b / c

    // Assume the original point array is given in clockwise fashion
    a = -a
    b = -b

    // Even though a was calculated for diff of y, and b was calculated for diff of x
    // the new x is calculated using a and new y with b as this is what gives us the
    // perpendicular slope versus the slope of the given line
    xNew = xNew + a * amountPixelsToMoveLine
    yNew = yNew + b * amountPixelsToMoveLine

    // Integerize the point
    int xListAdd = (int)xNew
    int yListAdd = (int)yNew

    // Add the new point to the list
    AddPointToNewPointList(xListAdd, yListAdd)

Delete the old point list

我正在执行的几何图像: Image of the Geometry I am algorithmically describing above