Wykrywanie kolorów na formie

0

Witam!

Załóżmy, że mam wpisany jakiś kolor do TColor. Jak wykryć ten kolor na formie? Chodzi mi o dokładne współrzędne.

Proszę o pomoc.

0

Np. w ten sposób:

procedure TForm1.Button1Click(Sender: TObject);
var x,y: Integer;
    szukany_kolor: TColor;
begin
  Form1.Canvas.Pixels[10,10]:=clRed;
  szukany_kolor:=clRed;
  for x:=0 to Form1.Width do
    for y:=0 to Form1.Height do
      If Form1.Canvas.Pixels[x,y]=szukany_kolor then Form1.Caption:='['+IntToStr(x)+','+IntToStr(y)+']';
  Button1.Caption:='Koniec szukania';
end;
0

Wiadomo, że ta pętla wykona się bardzo szybko. Jednak ja bym dla poprawności dodał tam jeszcze Break'a.
Oczywiście jeśli zależy nam na wskazaniu tylko pierwszego wystapienia, a jak więcej to użyć chocby tablicy.

//...
      if Form1.Canvas.Pixels[X, Y] = Szukany_Kolor then
      begin
        Form1.Caption := '[' + IntToStr(X) + ',' + IntToStr(Y) + ']';
        Button1.Caption := 'Koniec szukania';
        Break;
      end;
0

Witam!
Dziękuję za odpowiedzi, lecz kod, który wskazał MartinEagle strasznie długo się wykonuje oraz pobiera bardzo dużo pamięci (zawiesza program) :( Czy jest jakiś inny sposób?

0

Ja innego sposobu nie znam, ale na zablokowanie aplikacji powinno pomóc uruchomienie go w wątku.
Jak coś to artykuł na ten temat: http://4programmers.net/Delphi/Artykuły/Wątki?sid=5512d14e05d7e594f74db2a36b1b67f0

0

Jeśli masz sporych rozmiarów Formę i "małą" maszynę, to podejrzewam, że przeszukiwanie wolno pójdzie.

Aha, samo wypisywanie: Form1.Caption:='['+IntToStr(x)+','+IntToStr(y)+']' czasowo wykańcza program. Właśnie wypróbowałem.

0

Nie no jak ustawianie caption'a może wykańczać program. Pętla która się wykonuje kilkaset tysięcy razy może nieco przymulić, ale żeby zawiesić....

Rozwiązań jest kilka:

  • scanline
  • application.processmessages
  • wątki

Optymalizacja olesia to podstawa.

b

0
b0bik napisał(a)

Nie no jak ustawianie caption'a może wykańczać program.
b

Zrobiłem test:

  1. dla Formy: ClientHeight=200; ClientWidth=300;
  2. oraz
procedure TForm1.Button1Click(Sender: TObject);
var x,y: Integer;
    szukany_kolor: TColor;
begin
  Form1.Canvas.Pixels[299,199]:=clRed;
  szukany_kolor:=clRed;
  for x:=0 to Form1.Width do
    for y:=0 to Form1.Height do
      If Form1.Canvas.Pixels[x,y]  <>  szukany_kolor then // znak różności
         Form1.Caption:='['+IntToStr(x)+','+IntToStr(y)+']';
  Button1.Caption:='Koniec szukania';
end;

czyli skrajny przypadek (szukany kolor na każdym miejscu oprócz ostatniego). Pomijając precyzyjny pomiar, czyli ze stoperem w ręku, przeszukanie i wypisanie każdej pozycji zajęło 2min16sek.
Natomiast zastępując <> znakiem = , bardzo bardzo krótko to trwało. Więc zamula program, choć nie zawiesza.

0

getFormImage (czy tam bitmap) + scanline to chyba najrozsądniejsze rozwiazanie.

0
MartinEagle napisał(a)

przeszukanie i wypisanie każdej pozycji zajęło 2min16sek

Założe się że ze scanline nie zajmie 10s.
b

0

.Pixels[] jest zue - szczerze to nie powinno być go wcale.

0
b0bik napisał(a)
MartinEagle napisał(a)

przeszukanie i wypisanie każdej pozycji zajęło 2min16sek

Założe się że ze scanline nie zajmie 10s.
b

Gratuluję czytania ze zrozumieniem. :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1