加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 图像的Floodfill部分

发布时间:2020-12-15 04:11:20 所属栏目:大数据 来源:网络整理
导读:我有一个像波纹管的图像 我想让图像变得像 我已经编写了代码,如下所示: var Tx,Ty,R,G,B,A,posX,posY : integer;begin posX :=-1; posY := -1; for Ty:= 0 to Image1.Height-1 do begin for Tx:= 0 to Image1.Width-1 do begin R:= GetRValue(image1.Canvas
我有一个像波纹管的图像

我想让图像变得像

我已经编写了代码,如下所示:

var
  Tx,Ty,R,G,B,A,posX,posY : integer;
begin
  posX :=-1; posY := -1;
  for Ty:= 0 to Image1.Height-1 do
  begin
    for Tx:= 0 to Image1.Width-1 do
    begin
      R:= GetRValue(image1.Canvas.Pixels[Tx,Ty]);
      G:= GetGValue(image1.Canvas.Pixels[Tx,Ty]);
      B:= GetBValue(image1.Canvas.Pixels[Tx,Ty]);
      A:= (R + G + B) Div 3;

      if (A > 50) then
      begin
         Image1.Canvas.Pixels[Tx,Ty] := rgb(255,255,255);
      end else
      begin
         Image1.Canvas.Pixels[Tx,Ty] := rgb(0,0);
         if (posX < 0) then
         begin
           posX := Tx;
           posY := Ty;
         end;
      end;
   end;
  end;
 Image1.Canvas.Brush.Style := bsSolid;
 Image1.Canvas.Brush.Color := clred;
 Image1.Canvas.FloodFill(posX,posY,clBlack,fsSurface);
end;

我上面的编码只能使点填充泛滥.

我怎样才能像结果图像一样进行填充?谢谢

解决方法

您似乎想要用红色替换所有暗像素,并用白色替换所有亮像素.你的代码几乎就在那里.不是用黑色替换黑暗像素,然后用黑色像素填充,为什么不直接将它们设置为红色,而是完全忘记洪水填充.

只需用clRed替换代码中的RGB(0,0),并删除与floodfill相关的所有代码.

我应该试着解释洪水填充是什么以及为什么它没有达到预期效果.填充将所有类似颜色的,连续相邻的像素的颜色改变为所选择的种子像素.也就是说,它从您选择的像素开始,在您的情况下,(posX,posY).它处理该像素,然后处理与该像素相邻的所有相同颜色的像素,然后处理与这些像素相邻的相同颜色的像素,依此类推.

在这种情况下,您可以在字母i上的点中的某个点开始填充. “泛滥”从该点向外扩展,从黑色像素到黑色像素,直到它撞击由白色像素形成的边界.洪水永远不会到达字母i的主体,因为这些点与种子点不相邻.

来自维基百科的这个链接有更多的解释和一些可能有助于您理解的动画. http://en.wikipedia.org/wiki/Flood_fill

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读