Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Mehrere Farben vergleichen (https://www.delphipraxis.net/105551-mehrere-farben-vergleichen.html)

qb-tim 24. Dez 2007 08:52


Mehrere Farben vergleichen
 
Hi,

ich möchte mit meinem Programm eine Anzahl n Farbwerte (TColor) miteinander vergleichen und den am häufigsten vorkommenden Farbwert ausgeben. Ich bin aber an jedem eigenem Versuch gescheitert.

Plan:
Delphi-Quellcode:

...
// Farbwerte auslesen
...
MainColor := CompareColor( {Array of TColor} );
...

function TForm1.CompareColor(Colors: Array of TColor): TColor;
begin
  // ?????
end;

DeddyH 24. Dez 2007 08:59

Re: Mehrere Farben vergleichen
 
Wie sieht das übergebene Array denn aus? Kommen da Farben evtl. mehrfach drin vor?

[edit] Blöde Frage, sonst müsste man j nicht zählen :oops: [/edit]

[edit2] Doch noch eine sinnvolle Frage: Wenn das Array so aussieht [blau,blau,blau,rot,rot,rot,grün,grün,grün,schwarz], was soll die Funktion denn dann zurückliefern? blau, rot, oder grün? [/edit2]

marabu 24. Dez 2007 09:10

Re: Mehrere Farben vergleichen
 
Hallo,

die Häufigkeit der Farben eines Bildes liefert ein Farbhistogramm.

Frohe Weihnachten

alzaimar 24. Dez 2007 09:17

Re: Mehrere Farben vergleichen
 
Du benötigst einen Container, bei dem Du nach einem TColor (=Cardinal)-Schlüssel suchen kannst. Du kannst eine TStringList bzw. eine THashedStringlist verwenden. Der Schlüssel ist dann IntToStr (MyColor). Die Objects-Eigenschaft misbrauchst du als Zähler. Anschließend sortierst Du nach Integer (Objects[*]) und -bupps- hast Du deine Häufigkeitsverteilung.

Delphi-Quellcode:
Procedure CountColor (aColor : TColor; aList : TStringList);
Var
  sKey : String;
  i : Integer;

Begin
  sKey := IntToStr (aColor);
  i := aList.IndexOf (sKey);
  If i=-1 Then
    i := aList.Add (sKey, Pointer (1))
  Else
    aList.Objects[i] := Pointer (Integer (aList.Objects[i]) + 1);
End;

function CompareObjects (List: TStringList; Index1, Index2: Integer): Integer;
Begin
  Result := Integer (List.Objects[Index2]) - Integer(List.Objects[Index1]);
End;

Procedure SortByIntegerObject (aList : TStringList);
Begin
  aList.CustomSort (CompareObjects);
End;


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:14 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz