0

我想对绘制的位图进行命中测试,以查看给定点是否在图像的非透明像素中可见。

例如,要对整个位图矩形进行此测试,您可以执行以下操作:

Bitmap bitmap = new Bitmap("filename.jpg");
GraphicsPath path = new GraphicsPath();
Rectangle bitmapRect = new Rectangle(x, y, bitmap.Width, bitmap.Height);

path.AddRectangle(bitmapRect);

if (path.IsVisible(mouseLocation))
    OnBitmapClicked();

但是,如果我有一个非矩形项目的位图,并且我希望能够检查他们是否单击了非透明区域,那么 .NET 框架中是否有任何支持的方式来执行此操作?

我能想到的唯一方法是将位图字节锁定到一个数组中,并遍历它,将每个不透明的 x,y 坐标添加到 Point 结构数组中。然后使用这些点结构组装一个 GraphicsPath。

由于这些点将从零开始,因此我需要用绘制图像的 x,y 坐标与 0,0 之间的距离来偏移鼠标位置。但是这样,如果我多次绘制它,我基本上可以为每个图像使用相同的 GraphicsPath,只要图像没有倾斜或缩放不同。

如果这是唯一的好路线,我将如何将点添加到 GraphicsPath?从点到点画线?画一条闭合曲线?

4

1 回答 1

2

恕我直言,一种更简单的技术是查看命中像素的 alpha 分量:

Color pixel = bitmap.GetPixel(mouseLocation.X, mouseLocation.Y);
bool hit = pixel.A > 0;
于 2011-09-30T20:35:53.283 回答