delphi - 对于 TBitmap,FMX 中是否有相当于 FloodFill 的功能?

标签 delphi c++builder firemonkey vcl

我正在从 VCL 转换为 FMX。在VCL中,TBitmap的TCanvas中有一个名为FloodFill的函数,它允许TBitmap的 Canvas 充满特定的颜色,直到在位图的 Canvas 上达到另一种特定的颜色。

FMX 中有与此功能等效的函数吗?

最佳答案

根据 RRUZ 的回答和 Anthony 的回复,我编写了以下代码:

Procedure TForm1.FloodFill(BitmapData:TBitmapData; X, Y:Integer;  OldColor, NewColor: TAlphaColor);
var
  Current: TAlphaColor;
begin
  Current := BitmapData.GetPixel(X, Y);
  if Current = OldColor then begin
    BitmapData.SetPixel(X,Y,NewColor);
    FloodFill(BitmapData, X+1, Y, OldColor, NewColor);
    FloodFill(BitmapData, X-1, Y, OldColor, NewColor);
    FloodFill(BitmapData, X, Y+1, OldColor, NewColor);
    FloodFill(BitmapData, X, Y-1, OldColor, NewColor);
  end;
end;

以及使用示例:

procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Single);
var
  MyBmpData: TBitmapData;
  OldColor, NewColor: TAlphaColor;
  ix, iy: integer;
begin
  Image1.Bitmap.Canvas.Bitmap.Map(TMapAccess.ReadWrite, MyBmpData);

  ix := round(X); iy := Round(Y);
  OldColor := MyBmpData.GetPixel(ix, iy);
  NewColor := ColorComboBox1.Color; // or use some other source for a new color
  FloodFill(MyBmpData, ix, iy, OldColor, NewColor) ;

  Image1.Bitmap.Canvas.Bitmap.Unmap(MyBmpData);
end;

关于delphi - 对于 TBitmap,FMX 中是否有相当于 FloodFill 的功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22813461/

相关文章:

delphi - Indy FTP 客户端在尝试开始另一个上传后出现错误?

delphi - 从脚本创建表单/GUI/对话框的库?

delphi - 控制长时间运行的关键 ISAPI 进程

string - 快速 - 替换 AnsiString (C++) 中所有出现的 ' (apostrophe) with ' '(两个撇号)

ios - Delphi iOS 和平移手势 - 距离始终为零

delphi - 在 TChart 中设置线条颜色

multithreading - 简化 VCL 线程包装器代码

migration - C++ Builder XE 无法成功从 BCB6 转换项目

android - 如何在 Android 中使用 Delphi XE5 发送短信

android - firemonkey - 无法为支持 arm 7 rev5 neon 的 android 编译(异常类非法指令 (4))