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.
- function UniqueColors(const Bitmap: TBitmap): array of TRGBTriple;
- var
- Flags: array[byte, byte] of TBits;
- i: integer;
- j: integer;
- k: integer;
- rowIn: pRGBTripleArray;
-
- Colors: array of TRGBTriple ;
- numColors: integer;
- begin
- ASSERT (Bitmap.PixelFormat = pf24Bit);
-
- numColors := 0;
- for j := 0 to 255 do
- for i := 0 to 255 do
- Flags[i,j] := nil;
-
- for j := 0 to Bitmap.Height-1 do
- begin
- rowIn := Bitmap.Scanline[j];
- for i := 0 to Bitmap.Width-1 do
- begin
- with rowIn[i] do
- begin
- if not Assigned(Flags[rgbtRed, rgbtGreen])then
- begin
- Flags[rgbtRed, rgbtGreen] := TBits.Create;
- Flags[rgbtRed, rgbtGreen].Size := 256;
- end;
-
- //Hvis vi ikke har set farven før, så tilføj farven til listen.
- if not Flags[rgbtRed,rgbtGreen].Bits[rgbtBlue] then
- Flags[rgbtRed,rgbtGreen].Bits[rgbtBlue] := TRUE;
- Colors[numColors] = TRGBTriple.Create;
- Colors[numColors].rgbtRed := rgbtRed;
- Colors[numColors].rgbtGreen := rgbtGreen;
- Colors[numColors].rgbtBlue := rgbtBlue;
- numColors := numColors + 1;
- end;
- //Nu har vi set farven.
- Flags[rgbtRed,rgbtGreen].Bits[rgbtBlue] := TRUE;
- end;
- end;
- end;
-
- RESULT := Colors;
-
- end;
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