[c#] Redimensionner une image à l'aide de la souris [Résolu]

Messages postés
18
Date d'inscription
jeudi 22 septembre 2005
Dernière intervention
26 avril 2006
- - Dernière réponse : projetf
Messages postés
26
Date d'inscription
dimanche 15 avril 2007
Dernière intervention
27 avril 2009
- 1 mai 2007 à 13:37
Bonjour à tous!



Le titre n'est peut-être pas très parlant mais je vous explique: je
dispose d'un panel dans lequel se trouve une picturebox. Dans celle-ci,
je charge une image que je dois ensuite redimensionner selon les
critères du user.



Jusque là, pas de problèmes. Le soucis est que le redimensionnement se
fait au moyen de la souris; le user clique sur l'image (qui est dans la
picturebox) et créer un rectangle de la grandeur qu'il veut. Suite à
cela, mon programme détermine les grandeurs du rectangle et
redimensionne mon image aux dimensions du rectangle.



Actuellement, je tente de dessiner un bête rectangle sur mon image,
dans ma picturebox mais ca ne fonctionne pas. En effet, le rectangle se
dessine parfaitement sur la form mais pas sur le composant picturebox.



Je peine donc un peu et je m'y perd. Est-ce possible de faire ce que je
souhaite avec les coposants que j'utilise? Si oui, comment faire
apparaître mon rectangle carrément dans ma picturebox? un petit coup de
pouce serait le bienvenu siouplaît :)
Afficher la suite 

Votre réponse

10 réponses

Meilleure réponse
Messages postés
3248
Date d'inscription
lundi 25 avril 2005
Dernière intervention
27 octobre 2012
35
3
Merci
Il faut créer une instance de MyPictureBox et non plus de PictureBox, mais peu importe car Coq à montré précédemment qu'on pouvait utiliser la méthode ControlPaint.DrawReversibleFrame pour dessiner une séléction par dessus les contrôles, je pense que ça va convenir pour ce que tu veux faire :

public partial class Form1 : Form
{
private bool down;
private Point start;
private Rectangle selection;


public Form1( )
{
InitializeComponent( );


PictureBox pb = new PictureBox( );
pb.Location = new Point( 0, 0 );
pb.Size = new Size( 200, 200 );
pb.Image = Image.FromFile( "Miss.jpg" );
pb.SizeMode = PictureBoxSizeMode.StretchImage;
pb.MouseDown += new MouseEventHandler( PictureBox_MouseDown );
pb.MouseMove += new MouseEventHandler( PictureBox_MouseMove );
pb.MouseUp += new MouseEventHandler( PictureBox_MouseUp );


this.Controls.Add( pb );
}


private void PictureBox_MouseDown( object sender, MouseEventArgs e )
{
if ( e.Button == MouseButtons.Left )
{
down = true;
selection = Rectangle.Empty;
start = this.PointToScreen( new Point( e.X, e.Y ) );
}
}


private void PictureBox_MouseMove( object sender, MouseEventArgs e )
{
if ( down )
{
ControlPaint.DrawReversibleFrame( selection, this.BackColor, FrameStyle.Dashed );


Point end = this.PointToScreen( new Point( e.X, e.Y ) );
selection = new Rectangle( start.X, start.Y, end.X - start.X, end.Y - start.Y );

ControlPaint.DrawReversibleFrame( selection, this.BackColor, FrameStyle.Dashed );
}
}


private void PictureBox_MouseUp( object sender, MouseEventArgs e )
{
if ( down )
{
ControlPaint.DrawReversibleFrame( selection, this.BackColor, FrameStyle.Dashed );
down = false;
}
}
}

Merci Coq

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 120 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Lutinore
Messages postés
63
Date d'inscription
lundi 2 février 2004
Dernière intervention
19 mai 2010
0
Merci
Je ne crois pas que tu puisses manipuler ton image dans un picturebox,
tu devrais plutot la mettre dans un userControl , tu la dessine dans un
Graphics que tu peux manipuler (taille de l'image, si tu veux la
sauvegarder dans un autre format, taille ...)
Commenter la réponse de Equinox84
Messages postés
18
Date d'inscription
jeudi 22 septembre 2005
Dernière intervention
26 avril 2006
0
Merci
Le problème alors est que le reste de mon programme se base sur cette
picturebox. Cest-à-dire qu'il y a une autre méthode de
redimensionnement (à l'aide de textbox). En fait, tout ce que je veux,
c'est améliorer mon programme en rajoutant une fonctionnalité
intéressante.
Commenter la réponse de cs_Ninounette
Messages postés
4947
Date d'inscription
lundi 17 février 2003
Dernière intervention
14 février 2014
54
0
Merci
ce que tu peux faire, c'est mettre la propriété SizeMode du picturebox à Strech et en redimensionnant ton picturebox, ton image suivra

Sébastien FERRAND
[MVP Visual C#]
Commenter la réponse de sebmafate
Messages postés
18
Date d'inscription
jeudi 22 septembre 2005
Dernière intervention
26 avril 2006
0
Merci
L'idée n'est pas mauvaise mais pour mon cas, je dimensionne justement
ma picturebox à la taille de l'image(ce qui affiche ensuite les scroll
bar de mon panel).



Je suis un peu novice... ca consiste en quoi un "userControl"? J'ai un
peu lu dans la doc seulement me concernant, je ne vois pas trop comment
l'utiliser.
Commenter la réponse de cs_Ninounette
Messages postés
3248
Date d'inscription
lundi 25 avril 2005
Dernière intervention
27 octobre 2012
35
0
Merci
Salut, dis moi si ce code te convient , il te suffit de remplacer ta PictureBox par celle-ci :

public class MyPictureBox : PictureBox
{
private bool down = false;
private Pen pen = null;
private int x = 0;
private int y = 0;
private int w = 0;
private int h = 0;


public MyPictureBox( )
{
this.SetStyle
(
ControlStyles.UserPaint |
ControlStyles.AllPaintingInWmPaint |
ControlStyles.DoubleBuffer,
true
);


pen = new Pen( Color.Black );
pen.DashStyle = DashStyle.Dash;
}


protected override void OnMouseDown( MouseEventArgs e )
{
// base.OnMouseDown( e );


x = e.X;
y = e.Y;
down = true;
}


protected override void OnMouseUp( MouseEventArgs e )
{
// base.OnMouseUp( e );


down = false;
Invalidate( this.ClientRectangle ); // Efface la séléction.
}


protected override void OnMouseMove( MouseEventArgs e )
{
// base.OnMouseMove( e );


if ( down )
{
w = e.X - x;
h = e.Y - y;
Invalidate( this.ClientRectangle ); // Dessine la séléction.
}
}


protected override void OnPaint( PaintEventArgs e )
{
base.OnPaint( e );


Graphics g = e.Graphics;


if ( down )
{
g.DrawRectangle( pen, x, y, w, h );
}
}
}
Commenter la réponse de Lutinore
Messages postés
18
Date d'inscription
jeudi 22 septembre 2005
Dernière intervention
26 avril 2006
0
Merci
Une lueur dans le brouillard...



Je te remercie... je vais tester ça dans la semaine et vous redonnerai des nouvelles.
Commenter la réponse de cs_Ninounette
Messages postés
18
Date d'inscription
jeudi 22 septembre 2005
Dernière intervention
26 avril 2006
0
Merci
Voici mon programme actuel (sans remplacement de la picture box).



private void bt_Click(object sender, System.EventArgs e)

{

this.search_file.ShowDialog();

if (this.search_file.FileName != "")

{

picture = new Redim(this.search_file.FileName);

this.PBenfant.Height = picture.GetHeightPix();

this.PBenfant.Width = picture.GetWidthPix();

}

temp = picture.GetCopie();

ShowPicture();

}



private void ShowPicture()

{

if (this.picture != null && this.picture.flag)

{

this.PBenfant.Image = picture.GetImage();




if(PBenfant.Height > p.Height || PBenfant.Width
> p.Width)

{

p.AutoScroll = true;


p.AutoScrollMinSize =
PBenfant.Size;


PBenfant.SizeMode =
PictureBoxSizeMode.StretchImage;

}

}

}



Je tente de remplacer PBenfant seulement, lorsque j'arrive dans la
fonction ShowPicture(), ma nouvelle pictureBox n'est pas reconnue donc
je ne peux même pas mettre mon image dedans (et l'afficher)... J'ai
loupé qqch?
Commenter la réponse de cs_Ninounette
Messages postés
18
Date d'inscription
jeudi 22 septembre 2005
Dernière intervention
26 avril 2006
0
Merci
Merci beaucoup!



Le code fonctionne, j'ai bien un rectangle qui se dessine. Il me manque
plus qu'à prendre les dimensions de celui-ci et à les attribuer à mon
image pour qu'elle prenne la taille du rectangle!



Merci bicoup!
Commenter la réponse de cs_Ninounette
Messages postés
26
Date d'inscription
dimanche 15 avril 2007
Dernière intervention
27 avril 2009
0
Merci
salut a tous !
g a a peut pres la mm question. mais ce qu eje voudrai sa serrai enfait de pouvoir redimmensionner mon image dans ma form avec la souris. comme un peut ce kon peut faire avc nimporte quelle fenetre....
Commenter la réponse de projetf

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.