Autor Beitrag
Timelesk
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 82


Delphi 2006 Prof
BeitragVerfasst: Mi 26.07.06 20:05 
Hallo,

ich bin heute über ein sonderbares Problem gestoßen:

Ich erstelle eine TImage-Komponente zur Laufzeit:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
  image_map := TImage.Create(image_map);
  with image_map do begin
    Picture.Bitmap.PixelFormat := pf16Bit;
    Parent := karte;
    Visible := true;
    AutoSize := true;
    Left := 5;
    Top := 5;
    Cursor := crHandPoint;
    OnClick := mapClick;
  end;


Danach lade ich ganz normal ein Bild mit verschiedenen Bereichen rein!
Die Bereiche sind farblich unterschiedlich markiert und sofern man sich über einem Bereich befindet, soll ein Infotext erscheinen.
Das ganze muss, soll und geht über die Farberkennung des Bereiches!

Nun wird Anhand eines Pixels auf dem Bild die Farbe des Bereiches individuell für den Computer geholt und in den Array colors: array of TColor; gespeichert:
ausblenden Delphi-Quelltext
1:
colors[loop] := image_map.Canvas.Pixels[x,y];					


Jetzt wird anhand eines Timers mit Intervall 100 die Farbe unter der Maus geholt und ausgewertet:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
var
  DC: HDC;
  pt: TPoint;
  color_act: TColor;
begin
  GetCursorPos(pt);
  color_act := GetPixel(DC, pt.x, pt.y);
  //for-Schleife mit Vergleich zwischen "color_act" und Array "colors"
end;


=============================================

Soviel zur Erläuterung der Aufgabe!

Hat man nun in der Farbtiefe 32bit eingestellt (Windows, nicht mein Programm!!!), so funktioniert alles einwandfrei und ohne Probleme!
Sollte man jedoch 16bit-Farbtiefe eingestellt haben, so erkennt er die Bereiche nicht und liefert unterschiedliche Werte: Die der 1. Array-Wert stimmt nicht mit dem Color-Wert des ersten Bereiches überein!

Woran liegt das?

Hab's auch schon mit
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
var
  v1: TCanvas;
begin
  GetCursorPos(pt);
  v1:=TCanvas.create;
  v1.handle:=GetWindowDC(GetDesktopWindow);
  color_act := getpixel(v1.handle,pt.x,pt.y);
  v1.free;
end;

//oder

var
  v2 = HDC;
begin
  v2 := CreateDC('DISPLAY',NIL,NIL,NIL);
  color_act := GetPixel(v2,pt.x,pt.y);
  deleteDC(v2);
end;

probiert!

Ohne Erfolg! Keine Chance!
Ich verzweifle hier!

S.O.S. - help, please - Hilfe

Freue mich über jede Antwort :)


gruß
Timelesk
Spaceguide
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 552


(D3/D7/D8) Prof.
BeitragVerfasst: Mi 26.07.06 20:11 
Kannst du nicht einfach TImage.Canvas.Pixels im OnMouseMove-Event des TImages abfragen und das mit den Farben vergleichen?
Timelesk Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 82


Delphi 2006 Prof
BeitragVerfasst: Mi 26.07.06 20:42 
Naja,

ich hab hier im Forum gelesen, dass das ziemlich langsam sein soll & es wird halt 10x pro Sekunde die Farbe ausgelesen!

-------

Habs eben getestet!
Damit funktioniert es einwandfrei!
Muss ich halt auf das MouseMove-Event zurückgreifen!
Lasse dort nun nur den Wert belegen und die Auswertung geschieht weiterhin durch den Timer!
Somit ist es nicht so ressourcenintensiv!


Vielen Dank für die schnelle und einfache Lösung ;)


gruß
Timelesk
Lossy eX
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1048
Erhaltene Danke: 4



BeitragVerfasst: Do 27.07.06 08:47 
Ein kleiner Hinweis am Rande. GetPixel und Canvas.Pixels sind ziemlich genau ein und das Selbe. Intern ruft Canvas.Pixel nämlich nur GetPixel auf. Und diese Angaben zum Thema langsam beziehen sich normal nur darauf, wenn du große Mengen an Pixel abfragen oder setzen möchtest. Für 10 Pixel in einer Sekunde ist der Unterschied wohl kaum messenbar geschweige denn spürenbar. Dazu muss man nicht den Akt betreiben und sich die Daten direkt aus dem Speicher holen.

_________________
Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.