代码之家  ›  专栏  ›  技术社区  ›  Chris

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

  •  1
  • Chris  · 技术社区  · 14 年前

    例如,我有以下两幅图像:

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

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

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

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

    2 回复  |  直到 14 年前
        1
  •  1
  •   jrista    14 年前

    这看起来像是一个简单的问题,只显示完整的地图图像,并将光标坐标移动到该图像上对应的遮罩图像坐标。你可以在这里做两件事。将遮罩图像保持黑白,并将每个区域的地图与某些内容关联,这些内容定义了悬停该区域时要执行的操作。或者,将遮罩更改为多色图像,然后简单地将每个颜色代码映射到定义悬停区域时要执行的操作的内容。我个人会选择后者,因为它要简单得多,而且您可以使用大约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();
    

    我知道这很粗糙。如果我有更多关于你想在某个特定区域的悬停状态下做什么的信息,我可能会提供更多。

        2
  •  0
  •   Mau    14 年前

    如果要将图像加载到位图对象中,可以使用bitmap.getPixel()检查其alpha值(0完全透明,255完全不透明),从而检查像素是否透明。

    如果您只需要对每个透明像素做一些事情,我想不需要在单独的对象中创建一个选择。只要迭代像素,如果一个是透明的,那么就做你必须做的。

    如果您确实需要创建一个选择,那么您可以使用与原始图像大小相同的每像素1位位图。白色代表选定区域,黑色代表未选定区域(或与之相反,您的选择)。

    见: http://msdn.microsoft.com/en-us/library/system.drawing.bitmap.aspx