gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 00:49:48 24 4
gpt4 key购买 nike

我想使用 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 图像使用洪水填充?

最佳答案

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

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;

关于delphi - 如何对 TImage 中加载的 Png 图形使用 FloodFill?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19343470/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com