我想使用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图像?
答案 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;