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

Résolu
cs_Ninounette Messages postés 18 Date d'inscription jeudi 22 septembre 2005 Statut Membre Dernière intervention 26 avril 2006 - 30 janv. 2006 à 11:51
projetf Messages postés 26 Date d'inscription dimanche 15 avril 2007 Statut Membre 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 :)

10 réponses

Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
6 févr. 2006 à 11:36
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
3
Equinox84 Messages postés 63 Date d'inscription lundi 2 février 2004 Statut Membre Dernière intervention 19 mai 2010
30 janv. 2006 à 12:03
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 ...)
0
cs_Ninounette Messages postés 18 Date d'inscription jeudi 22 septembre 2005 Statut Membre Dernière intervention 26 avril 2006
30 janv. 2006 à 12:15
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.
0
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 36
30 janv. 2006 à 12:34
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#]
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Ninounette Messages postés 18 Date d'inscription jeudi 22 septembre 2005 Statut Membre Dernière intervention 26 avril 2006
30 janv. 2006 à 13:35
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.
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
30 janv. 2006 à 16:09
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 );
}
}
}
0
cs_Ninounette Messages postés 18 Date d'inscription jeudi 22 septembre 2005 Statut Membre Dernière intervention 26 avril 2006
31 janv. 2006 à 20:40
Une lueur dans le brouillard...



Je te remercie... je vais tester ça dans la semaine et vous redonnerai des nouvelles.
0
cs_Ninounette Messages postés 18 Date d'inscription jeudi 22 septembre 2005 Statut Membre Dernière intervention 26 avril 2006
6 févr. 2006 à 08:50
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?
0
cs_Ninounette Messages postés 18 Date d'inscription jeudi 22 septembre 2005 Statut Membre Dernière intervention 26 avril 2006
9 févr. 2006 à 09:27
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!
0
projetf Messages postés 26 Date d'inscription dimanche 15 avril 2007 Statut Membre Dernière intervention 27 avril 2009
1 mai 2007 à 13:37
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....
0
Rejoignez-nous