none
如何用某种颜色填充Bitmap对象中的封闭区域? RRS feed

  • 问题

  • 要实现给出区域内一点,用某种颜色填充该区域的功能,类似“画图”中的颜料桶功能。这是对以前的问题http://social.microsoft.com/Forums/zh-CN/2212/thread/5325a06c-8422-4c8e-95ca-640c5473fe02的补充。现在遇到的问题是:使用ExtFloodFill这个api只能在picturebox等控件上实现填充,而无法在Bitmap对象上填充,原因可能是只有控件才有设备上下文句柄吧。那么如果我想在Bitmap上填充,该怎么办呢?

    我还是倾向于调用系统api,不想自己写区域填充算法,如果有什么第三方类库实现了这个功能的话,也请告诉我,谢谢。

    2010年10月27日 9:26

答案

全部回复

  • 您可以先用 Graphics.FromImage 方法把 Bitmap 绑定到一个 Graphics,然后就很方便了,用 Fill 等方法都可以实现填充了。


    Mark Zhou
    2010年10月27日 9:31
  • 您可以先用 Graphics.FromImage 方法把 Bitmap 绑定到一个 Graphics,然后就很方便了,用 Fill 等方法都可以实现填充了。


    Mark Zhou


    您没理解我的意思,Graphics类的Fill系列方法都要求在参数中给出要填充的形状的信息,而我的需求是这样的:要填充的区域是已经画好的封闭区域,只知道区域内的一个点的坐标,而区域本身的形状是无法用参数描述的(也是无法预知的),要用类似泛洪的方法从这一点开始填充,直到遇到边界为止。就和ExtFloodFill这个api的功能差不多。

     

    2010年10月27日 9:50
  • 你好:

    就我所知,你所说的功能比较难以实现,好像是使用某种算法,对你所指点所在区域进行像素识别,然后进行填充。比较专业的说。

    你可以尝试搜索该类算法。但可以肯定的是一定可以实现。


    I am here!
    2010年10月29日 2:29
    版主
  • 我觉得这是个很基础的功能呀,难道没有相应的api么?那么windows附件中的画图软件是如何实现该功能的呢?既然画图已经实现了,那么我能不能直接调用相关函数呢?
    2010年10月29日 2:52
  • 你好:

    你可以想象该功能不容易实现。应该是有某种算法可以容易,但我不太清楚。在flash中有这样的,充溢填充,就是指完全填充一个不规则的区域。使用BitmapData类的floodFill()方法,调用形式为:floodFill(x,y,color),其中x,y为要填充的坐标点,color为坐标颜色。需要特别这样的是,填充的始终是该坐标点最上层的容器元素。

    .Net库中提供的不规则填充是需要指定不规则区域的GraphicsPath,但从你的需求上看几乎找不到,你可以查看相关gdi书籍.


    I am here!
    2010年10月29日 3:05
    版主
  • 我以前问过这个问题的,当时周雪峰版主给出了一个解决方案,就是直接调用ExtFloodFill这个api。这个方案已经能够解决一半的问题了,在picturebox控件上能够实现填充,但是对Bitmap无效,也不知道是怎么回事。所以我还是想沿着这一思路,继续解决剩余的问题,希望周版主能再帮我看一下,谢谢。

    至于区域填充算法,我也搜索过,也没找到太完美的,往往遇到比较奇异的图形就不灵了。谁能告诉我ExtFloodFill内部使用的填充算法是什么?或者是其他的比较好的算法也行。

    2010年10月29日 3:10
  • 如果.net标准类库中没有这个功能的话,那么DirectX甚至XNA这类“高级”的微软官方图形库中总该有吧?请知道的朋友告诉我,在此谢过。我不介意使用这些类库。
    2010年10月29日 5:11
  • 如果是跟界面无关,仅对位图本身操作,那得使用“区域生长”算法。

    基本思想是在一个区域内部选取一个“种子点”,以种子点为基础以一定约束条件向外生长。这是一个基本的图像处理算法,以“区域生长”为关键词,你会找到一些更有用的信息。例如:http://blog.csdn.net/corrupt/archive/2007/02/07/1504595.aspx

    • 已标记为答案 062369 2010年10月31日 0:38
    2010年10月30日 5:24