Cadre de selection dans un timage

0/5 (3 avis)

Vue 7 424 fois - Téléchargée 1 109 fois

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

Ajouter un commentaire Commentaires
padsou Messages postés 121 Date d'inscription jeudi 24 janvier 2002 Statut Membre Dernière intervention 13 avril 2010
5 févr. 2007 à 12:52
Même soucis que précédement mais réglé dans mon cas en supprimant :

Image1.Canvas.FrameRect(MyRect);
à la fin de la méthode MouseMove.
Le soucis que j'ai pour ma part vient du fait que le rectangle de selection ne s'efface pas lorsque je clique à nouveau ou que je fais une nouvelle selection.
dieuchrist Messages postés 9 Date d'inscription mercredi 1 novembre 2006 Statut Membre Dernière intervention 27 novembre 2006
7 nov. 2006 à 10:50
hello, de 1 ton code fonctionne très bien mise a pars que j'ai le même problème que damecrogg.donc si tu aurai la soluce sa serai cool. merci
damecrogg Messages postés 2 Date d'inscription mercredi 9 juin 2004 Statut Membre Dernière intervention 22 juin 2004
22 juin 2004 à 10:48
bonjour,
ton code m'a été bien utile. cependant j'ai un petit souci : quand je déplace la zone de sélection, l'empreinte reste là où je l'avais tracée au départ. je pense à un problème de raffraichissement. aurais-tu une idée pour résoudre le problème?
merci

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.