J'essaie de faire pivoter un bitmap de 90 degrés à l'aide de la fonction suivante. Le problème est qu'il coupe une partie de l'image lorsque la hauteur et la largeur ne sont pas égales.
Remarquez la largeur returnBitmap = original.height et sa hauteur = original.width
Quelqu'un peut-il m'aider à résoudre ce problème ou signaler ce que je fais mal?
private Bitmap rotateImage90(Bitmap b)
{
Bitmap returnBitmap = new Bitmap(b.Height, b.Width);
Graphics g = Graphics.FromImage(returnBitmap);
g.TranslateTransform((float)b.Width / 2, (float)b.Height / 2);
g.RotateTransform(90);
g.TranslateTransform(-(float)b.Width / 2, -(float)b.Height / 2);
g.DrawImage(b, new Point(0, 0));
return returnBitmap;
}
Qu'en est-il de this :
private void RotateAndSaveImage(String input, String output)
{
//create an object that we can use to examine an image file
using (Image img = Image.FromFile(input))
{
//rotate the picture by 90 degrees and re-save the picture as a Jpeg
img.RotateFlip(RotateFlipType.Rotate90FlipNone);
img.Save(output, System.Drawing.Imaging.ImageFormat.Jpeg);
}
}
Le bogue est dans votre premier appel à TranslateTransform
:
g.TranslateTransform((float)b.Width / 2, (float)b.Height / 2);
Cette transformation doit être dans l'espace de coordonnées de returnBitmap
plutôt que b
, donc cela devrait être:
g.TranslateTransform((float)b.Height / 2, (float)b.Width / 2);
ou équivalent
g.TranslateTransform((float)returnBitmap.Width / 2, (float)returnBitmap.Height / 2);
Votre deuxième TranslateTransform
est correct, car il sera appliqué avant la rotation.
Cependant, vous êtes probablement mieux avec la méthode plus simple RotateFlip
, comme l'a suggéré Rubens Farias.
Je suis tombé sur et avec une petite modification je l'ai fait fonctionner. J'ai trouvé d'autres exemples et j'ai remarqué qu'il manquait quelque chose qui faisait la différence pour moi. J'ai dû appeler SetResolution, si je ne l'ai pas fait, l'image s'est retrouvée à la mauvaise taille. J'ai également remarqué que la hauteur et la largeur étaient à l'envers, bien que je pense qu'il y aurait de toute façon une modification pour une image non carrée. J'ai pensé que je publierais ceci pour toute personne qui tombe sur ce problème comme je l'ai fait avec le même problème.
Voici mon code
private static void RotateAndSaveImage(string input, string output, int angle)
{
//Open the source image and create the bitmap for the rotatated image
using (Bitmap sourceImage = new Bitmap(input))
using (Bitmap rotateImage = new Bitmap(sourceImage.Width, sourceImage.Height))
{
//Set the resolution for the rotation image
rotateImage.SetResolution(sourceImage.HorizontalResolution, sourceImage.VerticalResolution);
//Create a graphics object
using (Graphics gdi = Graphics.FromImage(rotateImage))
{
//Rotate the image
gdi.TranslateTransform((float)sourceImage.Width / 2, (float)sourceImage.Height / 2);
gdi.RotateTransform(angle);
gdi.TranslateTransform(-(float)sourceImage.Width / 2, -(float)sourceImage.Height / 2);
gdi.DrawImage(sourceImage, new System.Drawing.Point(0, 0));
}
//Save to a file
rotateImage.Save(output);
}
}