图像处理 - 定义源图像的选择

时间:2010-06-28 20:00:06

标签: c# image-processing

作为一个例子,我有以下两个图像:

http://img571.imageshack.us/i/spain.jpg/
http://img97.imageshack.us/i/spainoverlay.png/

我想加载第二个并检测透明区域以用作我可以应用某些处理的选择,但我没有第一个线索如何开始。我熟悉加载图像并在其上绘制形状和文字,但这就是它。

如何在透明区域上进行某种“魔杖”检测,以获取某些点或其他区域的定义以进行操作?

编辑:在第二张图片中,白色区域实际上是透明区域。由于imageshack的背景颜色,它们显示为白色。

2 个答案:

答案 0 :(得分:1)

这似乎只是一个简单的问题,即只显示整个地图图像,并将光标坐标在该图像上移动时映射到遮罩图像的相应坐标。你可以在这做两件事。保持蒙版图像为黑白,并且每个区域的地图都与某个区域相关联,这些区域定义了当该区域悬停时您想要执行的操作。或者,将您的蒙版更改为多色图像,并简单地将每个颜色代码映射到定义该区域悬停时您想要执行的操作的内容。我个人会选择后者,因为它更简单,你可以使用大约1600万个可能的区域(给定24位颜色)。

给出一个简单的映射类型:

class ZoneMap
{
    public Color MappedColor { get; set; }
    public Action OnHover { get; set; }
}

您可以通过将源图像的鼠标坐标转换为多色区域地图图像的相应坐标来查找映射区域,按颜色查找ZoneMap条目,并调用其OnHover操作:

var spainZones = new ZoneMap[]
{
    new ZoneMap { MappedColor = Color.Red, OnHover = new Action(RedHandler) },
    new ZoneMap { MappedColor = Color.Blue, OnHover = new Action(BlueHandler) }
}

var color = getZoneColor(Mouse.X, Mouse.Y); // translate source mouse coords to colored zone map coords and get color
var zone = spainZones.FirstOrDefault(zm => zm.MappedColor == color);

zone.OnHover();

我知道这很粗糙。如果我有关于在特定区域悬停时您想要做什么的更多信息,我可以提供更多信息。

答案 1 :(得分:0)

如果Bitmap对象是您用来加载图像的对象,可以通过使用Bitmap.GetPixel()检查其alpha值(0是完全透明,255是完全不透明)来检查像素是否透明。 / p>

如果您只需要对每个透明像素执行某些操作,我猜您无需在单独的对象中创建选区。只需遍历像素,如果一个是透明的,就做你必须做的事情。

如果确实需要创建选区,则可以使用与原始图像大小相同的单位1位像素位图。白色表示所选区域,未选择黑色(或相反,您的选择)。

请参阅: http://msdn.microsoft.com/en-us/library/system.drawing.bitmap.aspx