Finde unikke RGB-koder i en Bitmap

Tags:    delphi

Hvordan opretter jeg en liste, der på hurtigste måde finder de enkelte RGB-koder i en Bitmap.
Jeg kan godt finde de enkelte farver (og RGB-koder) med Scanline. (Pixel for Pixel.) Og jeg kan også oprette en liste over dem.
Men det tager det meste af en sommer. Og dem har vi som bekendt ikke for mange af herhjemme.:D

På nettet har jeg fundet en kode (funktion CountColors..osv) som lynhurtigt udregner antallet af farver i en Bitmap, og jeg har forsøgt at inkludere en funktion til at udtrække RGB-koderne.
Men uden større held.

Så...hvordan gør jeg.?

:O
MrLES.



4 svar postet i denne tråd vises herunder
1 indlæg har modtaget i alt 1 karma
Sorter efter stemmer Sorter efter dato
Nu har jeg aldrig rørt delphi, så kender ikke syntaksen (eller semantikken) men noget i denne her stil:

- Jeg har slettet det sidste siden vi ikke ønsker at vide hvor mange.
- Antager at resultatet skal gemmes i RESULT ? De sprog jeg kender bestemmer man selv hvad variabelnavnet er på resultatet.
- Jeg har tilføjet noget der skulle forestille en dynamisk array/liste i linje 9 samt en tal til at holde styr på indekset jeg indsætter i.
- Jeg har ændret nede ved linje 32 hvor jeg prøver at lave en ny RGB-trippel på den farve som skal ind i arrayet. Men jeg ved ikke om værdien er initialiseret til FALSE, eller om den er ukendt.

Der er nok nogle ting der skal rettes, men håber ideen skinner igennem. Flags bliver brugt til effektivt at checke om en farve allerede er fundet, og den dynamiske array til at gemme resultat i.

Fold kodeboks ind/udPascal kode 


EDIT: fandt dokumentationen for TBits.Create hvor den siger værdierne bliver initaliseret til 0 (hvilket jeg går ud fra svarer til FALSE).

EDIT2: Glemte at ændre returtypen. Den er ændret nu, men ved ikke om den er gyldig i delphi. Ændrede også lige navnet.



Indlæg senest redigeret d. 12.11.2012 01:44 af Bruger #14645
Uden at videre mere er mit bud på at det går langsomt netop at du bruge en liste. Hvilket kan være meget langsomt at sammenligne med hele tiden.

Mit bud ville følgende:

1. Brug/lav en RGB klasse/struct som kan hashes og har lighedsoperator(overloading). Dvs. du kan lave noget lignende rgbA == rgbB og den er så sand hvis r,g,b værdierne er ens for de 2.

2. Lav et "set"/hashset. De er meget hurtige at tjekke for om en værdi allerede er der.

3. Gå hver pixel igennem, så du har en af ovennævnte klasse for hver pixel. Tilføj den til "set'et", hvis den allerede er der kommer der ikke en til (sådan fungerer en typisk set-type).

4. Til slut, så har du alle værdierne i dit set. Hvis det skal være en liste af RGB-koder findes der nok en måde at skaffe værdierne ud af set'et så du kan smide dem ind i listen.

Pointen er at en set-datatype er meget hurtige til at tjekke for medlemskab.



Indlæg senest redigeret d. 11.11.2012 23:00 af Bruger #14645
Hej Søren.

Tak for dit svar.

Jeg benytter allerede et set, som du anbefaler. Og som du skriver i punkt 4, findes der nok en måde at skaffe værdierne ud af set'et på.

Det er netop denne 'måde' jeg efterlyser.

Her er den kode jeg benytter:

Fold kodeboks ind/udKode 


Jeg modtager antallet af unikke farver i Bitmap'en, og det virker som det skal.
Men mit problem - som jeg har kæmpet med i flere dage - er netop hvor og hvordan jeg skal udtrække RGB-koderne.

mvh
MrLES



Hej Søren.

Så lykkedes det.
Og der skulle egentlig ikke så meget til.

Når man sidder for længe med det, kan man godt se sig blind. Men du gav mig lige det der skulle til.

Så nu ser koden sådan ud:

Fold kodeboks ind/udPascal kode 


Som du kan se, er koden næsten uændret fra den oprindelige.
Der er blot tilføjet en linie (linie 45) med nogle Addon til en allerede eksisterende StringList, så funktionen nu leverer både antal farver og de enkelte RGB-koder.

Og det virker sgu' :lol:

Du skal have mange tak for hjælpen, Søren.
Dit svar har fået et hak op.

mvh
MrLES



Indlæg senest redigeret d. 12.11.2012 16:02 af Bruger #15158
t