Cadre de selection dans un timage

Description

Mon exemple montre comment effectuer manuellement un cadre de sélection sur un TImage. On peut aussi déplacer la zone sélectionnée. Lors d'une sélection ou d'un déplacement, il y a contrôle des débordements (la zone sélectionnée ou déplacée est contraint à ne pas quitter la surface occupée par l'image)
Tout cela permet à l'utilisateur d'effectuer des traitements sur une zone de l'image.
Les évènements solicités sont OnMouse Up/Down et Move.
deux exemples de traitements :
1. mettre en niveaux de gris la zone sélectionnée (ou l'image entière si aucune zone sélectionnée)
2. mettre en négatif la zone sélectionnée (ou l'image entière si aucune zone sélectionnée)

sur une image en 24 bits, chaque composante RGB est codée sur 8 bits (1 octet); autrement dit chaque coposante accepte une valeur de type byte (entre 0 et 255).
Même si on traite une image en 8bits, il faut l'assigner à un nouveau bitmap dont le pixelFormat sera de pf24bit (pour permettre le traitement de chaque composante sur 256 valeurs)
Mettre une image en niveau de gris consiste à faire une moyenne des composantes de chaque pixel et d'affecter cette moyenne à chaque composante (car une image en niveau de gris est une image dont les composantes ont la même valeur)
par ex :
R=0; G=0 et B=0 (pixel noir)
R=255; G=255 et B=255 (pixel blanc)
R=127; G=127; B=127 (pixel gris moyen)
R=100;G=50;B=40 donnera en niveau de gris R=G=B=(R+G+B) div 3

Pour une image en négatif, il suffit d'inverser la valeur de chaque composante
par ex :
si R=100; G=150 et B=250 alors cela donnera en négatif R=155; G=105 et B=5
si R=255; G=0 et B=0 (rouge pur), alors cela donnera une couleur cyan en négatif (R=0; G=255 et B=255)
voilà, j'espère que c'est clair.
Mon source est bien commenté en ce qui concerne la zone de sélection

Conclusion :


Remarquez que les traitements sur images sont optimals en utilisant la méthode scanline de la classe TBitmap. scanline est une méthode renvoyant un pointeur sur une ligne du bitmap.
Pour manipuler chaque ligne d'un Bitmap, on déclare une variable de type tableau dynamique de pointeur sur un tableau de triplet RGB.
Cette technique permet de manipuler les Bitmaps à un bas niveau, et c'est bien plus rapide que d'utiliser la propriété pixels[x,y] d'un canvas, et tout aussi simple (TabScanline[Ligne,Colonne].RGBTRed (et RGBTGreen et RGBTBlue) := MyByteVAR;

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.