2

我想使用 TCanvas 中的 FloodFill 函数。我有一张图片,它的图片是Png。当我打电话时

Image1.Canvas.FloodFill(20,20,clRed,fsBorder);

出现错误并说“只能修改包含位图的图像”

我写了一段这样的代码来解决我的问题。

procedure myChangeColor(p:TPngImage;colorSrc,ColorDest:TColor);
var i:Integer;
  j: Integer;
begin
  for i := 0 to p.Width - 1 do
    for j := 0 to p.Height - 1 do
      if(p.Canvas.Pixels[i,j]=ColorSrc)then
        p.Canvas.Pixels[i,j]:=ColorDest;
end;

它工作正常!但问题是执行此操作需要很多时间:(

我的 png 图片为 1.3 MB(高分辨率。14288x7200 像素 => 1.02 亿像素),更改颜色大约需要 2 分钟。这一定是一种方式。因为 Photoshop 用它的油漆桶做了大约 2 秒。

如何在 Delphi 中为 png 图像使用洪水填充?

4

1 回答 1

4

先将 PNG 转换为位图,然后您就可以使用画布进行此类绘图:

procedure TForm15.Image1Click(Sender: TObject);
var
  b: TBitmap;
  c: TCanvas;
begin

  // convert PNG->BITMAP
  b := TBitmap.Create;
  b.Assign(Image1.Picture.Graphic);
  Image1.Picture.bitmap := b;
  FreeAndNil(b);

  // draw
  c := image1.Canvas;
  c.Brush.Color := clBlue;
  c.Brush.Style := bsDiagCross;
  c.FloodFill(100,100,clBlack, fsBorder);
end;

更新:如果您需要将其保存在 PNG 中:

procedure TForm15.Image1Click(Sender: TObject);
var
  b: TBitmap;
  c: TCanvas;
  png: TPngImage;
begin
  b := TBitmap.Create;
  b.Assign(Image1.Picture.Graphic);

  c := b.Canvas;
  c.Brush.Color := clBlue;
  c.Brush.Style := bsDiagCross;
  c.FloodFill(100,100,clBlack, fsBorder);

  Image1.Picture.Graphic.Assign(b);
  b.Free;
end;

UPDATE2 相同,无需转换:

procedure TForm15.Image1Click(Sender: TObject);
var png: TPngImage;
begin
  png := (Image1.Picture.Graphic as TPngImage);
  png.Canvas.Brush.Color := clBlue;
  png.Canvas.Brush.Style := bsDiagCross;
  png.Canvas.FloodFill(100,100,clBlack, fsBorder);
  Image1.Refresh;
end;
于 2013-10-13T09:59:40.797 回答