web-dev-qa-db-fra.com

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

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);
    }
}
93
Rubens Farias

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.

9
finnw

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