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 億 200 万ピクセル) で、色を変更するのに約 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 に答える