如何使用FloodFill加载TImage中的Png图形?

时间:2013-10-13 09:01:03

标签: delphi

我想使用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中使用floodfill作为png图像?

1 个答案:

答案 0 :(得分:3)

首先将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;