|
|||||
Canvas Couleur Pixel Palette
|
type TRGBArray = ARRAY[0..0] OF TRGBTriple; // élément de bitmap (API windows) pRGBArray = ^TRGBArray; // type pointeur vers tableau 3 octets 24 bits RGBTriple est découpé
en |
Note :L'utilisation de tableau sans taille [0..0] implique que l'on compile sans vérification des limites ou avec {$R-}
Exemple : Eclaircir le bitmap Bmp0 de 10%
Procedure
Tform1.Eclaircir;
// colonnes, lignes
//
pointeur scanline
//
les 3 couleurs
// attention au -1
// scanline
//
attention au -1
|
Conseils
Certains traitements d'image (adoucir ou durcir une image, effectuer une rotation de d degrés) nécessitent de combiner plusieurs pixels voisins se trouvant sur différentes lignes. Dans ce cas, la fonction scanline exécutée plus que nécessaire peut devenir pénalisante. On peut l'optimiser de 2 manières:
Objectif : Adoucir le bitmap bmp0 avec résultat dans bmp1.
Les 2 bitmaps sont pf24bit et de même taille.
Le bmp1 résultat utilise normalement les scanlines (row1) car
les lignes sont utilisées les unes après les autres.
Pour bmp0 on crée un tableau de scanlines (scanrows0) car les
lignes précédentes et suivantes sont réutilisées
pour chaque ligne résultat. La technique de tableau de scanlines
permet de traiter le bitmap comme un tableau à 2 dimensions.
Pour adoucir l'image, on prend les valeurs des 8 pixels entourant
le pixel traité avec un coefficient de 1 si diagonale et de
2 si orthogonal. Le pixel du centre a un coefficient de 8 et puis
on divise le total
1 2 1
par
la somme des coefficients soit 16 pour conserver la pondération
des couleurs.
2 8 2
1 2 1
Cette matrice glissant sur tous les pixels de l'image se nomme un filtre. Noter les contrôles sur y et x pour éviter les effets de bord et maintenir les valeurs dans les intervalles 0..Bmp0.height - 1 et 0..Bmp0.width - 1.
Procedure
Tform1.adoucir; //
colonnes, lignes bitmap1
//
colonnes, lignes bitmap0
//
bitmap trop grand
// initialisation
du tableau de scanlines pour bmp0
// traitement
//
pour chaque pixel
//
les 3 lignes autour du pixel
//
les 3 colonnes
//
pas de test couleurs 0..255
|
La seconde technique d'optimisation des scanlines consiste à
effectuer une arithmétique sur les pointeurs. Il suffit pour
cela de calculer la différence entre le scanline de la ligne
0 et de la ligne 1
Procedure
Tform1.adoucir; //
colonnes, lignes bitmap1
x0,
y0 : integer; // colonne, lignes bitmap0
row0
: pRGBArray;
baserow0 := Bmp0.Scanline[0];
For y1 := 0 to
bmp1.height-1 do
// pour chaque pixel
For
j := -1 to 1 do //
les 3 lignes autour du pixel
For
i := -1 to 1 do //
les 3 colonnes begin //
un des 9 pixels if
y0 < 0 then y0 := 0; //
tests limites lignes if
y0 > bmp0.heigh-1 then y0 := bmp0.height-1; //
un des 9 pixels if
x0 < 0 then x0 := 0;
// tests limites colonnes if
x0 > bmp0.width-1 then y0 := bmp0.width-1;
|
Retour | Suite |