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:
- 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