这个线程几乎是我需要的: 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按钮的背景图像 - 如果这很重要的话。
答案 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
我正在执行的几何图像: