Policzyć kolory

0

Jak policzyć ilość kolorów obrazka w komponencie TImage, chodzi mi o to ile faktycznie jest kolorów w danej bitmapie.

:-(

0

Pewnie jakies podstawy programowania masz.

Zastanow sie jak bys mial tablice dwuwymiarowa 10 x 10 i wypelniona by ona byla liczbami z zakresu 1-255 (zalozmy), to jak bys policzyl ktore liczby i w jakiej ilosci wystepuja ??

tab: array[1..255] of integer;

Chyba z reszta dasz sobie rade, przepraszam, ale mozesz troche pokombinowac a na pewno sobie dasz rade. A ten przyklad na gorze ma ci w tym pomoc.

//Chyba od 0 do 255 :-) - Marooned

0

Dzięki za radę, ale taki sposób już próbowałem i policzenie kolorów w bitmapie 800x600 zajmuje dużo czasu.
Potrzebuje jakiejś szybkiej procedury ! :-(

//Po co piszesz dwa takie same posty pod sobą? - m.M

0

w gogle znajdź stronke efg's computer lab, w efg's poszukaj sekcji color, następnieściągnij programik ShowImage. w source jest wszystko co tobie potrzeba

0

rit, poczytaj o scanline

0

andrew, twoja metoda jest lekko dziwna, zgadnij ile kolorów może być na 32bitoweej bitmapce... Liczy się rzeczywiście scanlinem:

FUNCTION CountColors(CONST Bitmap: TBitmap): INTEGER;
VAR
Flags: ARRAY[BYTE, BYTE] OF TBits;
i : INTEGER;
j : INTEGER;
k : INTEGER;
rowIn: pRGBTripleArray;
BEGIN
// Be sure bitmap is 24-bits/pixel
ASSERT (Bitmap.PixelFormat = pf24Bit);

// Clear 2D array of TBits objects
FOR j := 0 TO 255 DO
  FOR i := 0 TO 255 DO
    Flags[i,j] := NIL;

// Step through each scanline of image
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
        // Create 3D column when needed
        Flags[rgbtRed, rgbtGreen] := TBits.Create;
        Flags[rgbtRed, rgbtGreen].Size := 256;
      END;

      // Mark this R-G-B triple
      Flags[rgbtRed,rgbtGreen].Bits[rgbtBlue] := TRUE
    END
  END
END;

RESULT := 0;
// Count and Free TBits objects
FOR j := 0 TO 255 DO
BEGIN
  FOR i := 0 TO 255 DO
  BEGIN

    IF   Assigned(Flags[i,j])
    THEN BEGIN
      FOR k := 0 TO 255 DO
        IF   Flags[i,j].Bits[k]
        THEN INC(RESULT);
      Flags[i,j].Free;
    END

  END
END

END {CountColors};

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