Bonjour,
Tu cherches si j'ai bien compris à détecter les blocs de 4 pixels, de couleur uniforme, présents dans un tableau carré, d'arête égale à 256, visible sur l'écran graphique.
La fonction GetPixel
Function GetPixel(u, v: Integer): Word;
renvoyant le numéro de la couleur actuelle du point de coordonnées (u, v), te donne accès aux quatre indices relatifs au bloc dont le coin supérieur gauche admet pour coordonnées (x, y):
1 2 3 4
| h:= GetPixel(x, y);
i:= GetPixel(x, y+1);
j:= GetPixel(x+1, y);
k:= GetPixel(x+1, y+1); |
Le test d'uniformité de couleur est donné au choix par l'un des algorithmes simples suivants (il y en a bien d'autres):
1 2 3 4 5 6 7
| Test1:= ((h=i) AND ((h=j) AND (h=k)));
s:= Abs(i - h); Inc(s, Abs(j - h)); Inc(s, Abs(k - h)); Test2:= (s=0);
s:= h;
IF (h=i) THEN Inc(s, 50); IF (h=j) THEN Inc(s, 50);
IF (h=k) THEN Inc(s, 50); Test3:= (s>149); |
Un inventaire méthodique te permet de repérer tous les blocs, de les dénombrer et de mémoriser les coordonnées du coin s.g., et même la couleur:
1 2 3 4 5 6
| Nb:= 0;
FOR x:= 0 TO 254 DO
FOR y:= 0 TO 254 DO
IF Test(x, y, h) THEN BEGIN
Inc(Nb); WriteLn(Fichier, Nb:8, x:5, y:5, h:4)
END; |
La dernière instruction <
WriteLn> (citée de mémoire) doit sans doute être complétée, afin de conduire à une ligne lisible.
La variable (Nb) peut être de type
Word, puisqu'elle est au plus égale à 255
2 = 65025 .
Si on la déclare comme liste de 16 éléments tous initialisés à zéro:
1 2
| Nb: ARRAY[0..15] OF Word;
FOR h:= 0 TO 15 DO Nb[h]:= 0; |
un décompte séparé sur les 16 couleurs devient possible en introduisant la nouvelle instruction:
Partager