Bonjour,
me voici confronté à un nouveau problème.
En fait, je suis façe à un probleme de DrawLine, et lorsque je le résoud, un second problème fait surface.
Pour simplifier l'explication, voici en bref ce que j'aimerais faire :
J'ai un PictureBox dans lequel je charge une image, en Bitmap.
(Mon PictureBox se nomme PBMain).
J'aimerais pouvoir dessiner sur l'image que je charge dans mon picturebox (PBMain.Image) afin d'en enregistrer les modifications. (et ainsi enregistrer une nouvelle image .JPG ou autre...).
Mais mon probleme se situe ici :
1) Lorsque je dessine dessus, L'image se duplique et s'agrandit dans ma picturebox PBMain. (Selon la résolution ...).
2) Lorsque je supprime la ligne suivante pour "corriger le probleme précédent" :
g.DrawImage(bmpInterne, e.ClipRectangle, e.ClipRectangle, GraphicsUnit.Pixel);
Il ne duplique plus l'image, mais alors j'ai un décallage qui se fait entre mon pointeur de souris et là où sont les coordonnées de la souris (et donc ma ligne se dessine plus loin que mon pointeur, en décallage).
Voici le code :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57 private bool bMouseDown = false; private Point OldPos = new Point(-1, -1); private Bitmap bmpInterne = new Bitmap(642, 424);//= new Bitmap(642, 424); // ------------> BITMAP DE TEST private Bitmap temp; private Color fPenColor = Color.DeepPink; //initialisation de la couleur à rouge private Graphics g; private void PBMain_MouseDown(object sender, MouseEventArgs e) { if (PBMain.Image != null) { bmpInterne = new Bitmap(PBMain.Image,PBMain.Image.Width, PBMain.Image.Height); //MessageBox.Show("Taille : bmpInt Width = " + bmpInterne.Width + " Height" + bmpInterne.Height, "Error"); bMouseDown = true; PBMain.Capture = true; OldPos = new Point(e.X, e.Y); } } private void PBMain_MouseUp(object sender, MouseEventArgs e) { bMouseDown = false; PBMain.Capture = false; } private void PBMain_MouseMove(object sender, MouseEventArgs e) { if (bMouseDown) { bmpInterne = (Bitmap)PBMain.Image; g = Graphics.FromImage(bmpInterne); g.SmoothingMode = SmoothingMode.HighQuality;//SmoothingMode.AntiAlias; Pen pen = new Pen(penColor, 3); //penColor = couleur ; 3 = épaisseur du trait if (OldPos != new Point(-1, -1)) g.DrawLine(pen, new Point(e.X, e.Y), OldPos); int offsetx = Math.Min(e.X, OldPos.Y); int offsety = Math.Min(e.Y, OldPos.Y); Rectangle rInvalid = new Rectangle(offsetx, offsety, Math.Abs(OldPos.X - e.X), Math.Abs(OldPos.Y - e.Y)); rInvalid.Inflate(3, 3); PBMain.Invalidate(rInvalid, true); OldPos = new Point(e.X, e.Y); PBMain.Refresh(); } } private void PBMain_Paint(object sender, PaintEventArgs e) { Graphics g = e.Graphics; g.DrawImage(bmpInterne, e.ClipRectangle, e.ClipRectangle, GraphicsUnit.Pixel); }
J'ai donc plusieurs questions :
1) Comment faire pour ne pas que l'image chargée dans ma pictureBox s'agrandisse (si sa résolution n'est pas la meme que la picturebox) lorsque j'appuie sur le bouton gauche de ma souris pour commencer à dessiner ?
2) Comment faire pour éviter le décallage entre mon pointeur et ce que je dessine exactement ?
3) Comment faire pour, combiner 2 images lors de l'enregistrement.
(Car je peux charger mon image, en dessinant sur un objet Graphics qui lui est superposé, mais lors de l'enregistrement, les modifications ne sont pas prises en compte car j'enregistre l'image dans la pictureBox).
Donc j'aimerais combiner l'image de ma pictureBox avec l'objet graphics sur lequel je dessine.
D'avance merci pour ceux qui pourront m'éclairer.
Partager