Witam Wszystkich,

chciałbym uzyskać efekt podobny do narzedzia w photoshopie "lasso magnetyczne". Jest to narzedzie do zaznaczania, które wykrywa w bitmapie krawędzie (nagłe zmiany kolorów) i korzystając z tego dopasowuje zaznaczenie do ruchów myszy.

Czy ktoś ma pomysł jak rozwiązać taki problem?

Myśle, że problem jest dwuetapowy:

  1. trzeba wykryć krawedzie. Najłatwiej byłoby chyba utworzyć tablice lub bitmape w której zapiszemy zmiany kolorów między sasiednimi pixelami. Wstępnie stworzyłem poniższy, bardzo nieoptymalny kod, który na podstawie imag1 rysuje w imag2 owe krawedzie:
procedure Tform1.button2Click(sender:TObject);
var i,j:Integer; kol:Tcolor;
begin
for i:=0 to image1.picture.bitmap.width-1 do
  for j:=0 to image1.picture.bitmap.height-1 do
    begin
    kol:=0;
    kol:= kol + RGBdiffs(i,j,i,j+1);
    kol:= kol + RGBdiffs(i,j,i+1,j);
    kol:= kol + RGBdiffs(i,j,i+1,j+1);
    image2.picture.bitmap.canvas.pixels[i,j]:=kol;
    end;  
end;

function Tform1.RGBdiffs(zi,zj,di,dj:Integer):TColor;
var zkol,dkol:TColor;
begin
  zkol := image1.picture.bitmap.canvas.pixels[zi,zj];
  dkol := image1.picture.bitmap.canvas.pixels[di,dj];
  result := Abs( GetRValue(zkol) - GetRValue(dkol) )
              +Abs( GetGValue(zkol) - GetGValue(dkol) )
              +Abs( GetBValue(zkol) - GetBValue(dkol) );
end;
Kolor poszczegolnych pixeli nie jest oczywiście kolorem w rozumieniu jakiejś barwy a jedynie liczbą tym wiekszą im bardziej dany pixel różni się od sasiednich.

2. tu pojawia się problem. Jak na podstawie tej bitmapy wykrywać, którędy powinno przejść zaznaczenie? W Photoshopie same tworza się jakby punkty zaczepienia, pomiędzy ktorymi tworzona jest linia. Jak szukać tych punktów. 

czekam na wszelkie propozycje i dywagacje