50 votes

C # faire pivoter le bitmap de 90 degrés

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;
    }
 

95voto

Rubens Farias Points 33357

Qu'en est- il :

 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);
    }
}
 

9voto

finnw Points 24592

Le bug est dans votre premier appel d' TranslateTransform:

g.TranslateTransform((float)b.Width / 2, (float)b.Height / 2);

Cette transformation doit être dans l'espace de coordonnées de l' returnBitmap plutôt que d' b, ce qui devrait être:

g.TranslateTransform((float)b.Height / 2, (float)b.Width / 2);

ou, de manière équivalente

g.TranslateTransform((float)returnBitmap.Width / 2, (float)returnBitmap.Height / 2);

Votre deuxième TranslateTransform est correct, car il doit être appliqué avant la rotation.

Cependant, vous êtes probablement mieux avec le plus simple RotateFlip méthode, comme Rubens Farias a suggéré.

2voto

thecaptain0220 Points 581

Je suis venu à travers et avec un peu de modification, je l'ai eu à travailler. J'ai trouvé quelques autres exemples et remarqué quelque chose qui manque qui a fait la différence pour moi. J'ai dû appeler SetResolution, si je n'ai pas l'image fini la mauvaise taille. J'ai aussi remarqué que la Hauteur et la Largeur étaient à l'envers mais je pense qu'il y aurait quelques modifications pour un non image carrée de toute façon. J'ai pensé que je poste ceci pour toute personne qui vient sur ce 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);
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X