Bonjour à tous,
mon objectif est de pouvoir "cadrer" une image provenant d'un scan. Celle ci serait un peu penchée et ne serait pas conforme pour un traitement futur. Afin de cadrer l'image chargée dans un picturebox, j'aimerais que l'utilisateur puisse cliquer sur deux points apparaissant sur l'image définissant la diagonale. A partir de ces deux points, le programme doit pouvoir faire pivoter l'image afin de la cadrer.
Pour faire pivoter l'image, j'ai créé cette classe qui utilise la méthode rotationflip de graphics, malheureusement le traitement semble sans effet chez moi.
Ici p1 et p2 représentent les points sur lesquelles l'utilisateur aurait cliqué, et nouveaup1 et nouveaup2 sont la nouvelle position souhaitée de ces points. La méthode pour calculer l'angle de rotation est basée sur les produits scalaires et le problème ne vient à priori pas d'elle mais plutôt du fait que je ne sais pas bien manipuler les graphics.
Le soucis principal est que le bitmap renvoyé est le même que Image passée dans le constructeur, sans qu'un rotation ne semble avoir été effectuée.
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Text;
namespace ImageRotation
{
public class ImageRotation
{
private Bitmap image;
private Point p1;
private Point p2;
private Point nouveaup1;
private Point nouveaup2;
int nouvelleLargeur;
int nouvelleHauteur;
public ImageRotation(Bitmap image, Point p1, Point p2, Point nouveaup1, Point nouveaup2, int nouvelleLargeur, int nouvelleHauteur)
{
this.image = image;
this.p1 = p1;
this.p1 = p2;
this.nouveaup1 = nouveaup1;
this.nouveaup2 = nouveaup2;
this.nouvelleHauteur = nouvelleHauteur;
this.nouvelleLargeur = nouvelleLargeur;
}
public Image traitement()
{
Graphics g = Graphics.FromImage(image);
Point v1 = new Point(p2.X - p1.X, p2.Y - p1.Y);
Point v2 = new Point(nouveaup2.X - nouveaup1.X, nouveaup2.Y - nouveaup1.Y);
double cosAngle = (v1.X * v2.X + v1.Y * v2.Y) / ((Math.Sqrt(v1.X * v1.X + v1.Y * v1.Y) * (Math.Sqrt(v2.X * v2.X + v2.Y * v2.Y))));
System.Windows.Forms.MessageBox.Show("cosangle" + cosAngle.ToString());
double angle = Math.Acos(cosAngle)* (180/Math.PI) ;
System.Windows.Forms.MessageBox.Show("angle" + angle.ToString());
g.RotateTransform((float)angle);
System.Windows.Forms.MessageBox.Show("j'ai soit disant tourné");
return new Bitmap(1000, 1000, g);
}
}
}
D'avance, merci pour votre aide.