Jak policzyć ilość kolorów obrazka w komponencie TImage, chodzi mi o to ile faktycznie jest kolorów w danej bitmapie.
:-(
Jak policzyć ilość kolorów obrazka w komponencie TImage, chodzi mi o to ile faktycznie jest kolorów w danej bitmapie.
:-(
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
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
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
rit, poczytaj o scanline
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};