2010-02-08 18 views
40

Ich versuche eine Bitmap um 90 Grad zu drehen, indem ich die folgende Funktion benutze. Das Problem dabei ist, dass ein Teil des Bildes abgeschnitten wird, wenn Höhe und Breite nicht gleich sind.C# Bitmap um 90 Grad drehen

Beachten Sie die returnBitmap width = original.height und es ist height = original.width

Kann mir jemand helfen, dieses Problem zu lösen oder darauf hinweisen, was ich falsch mache?

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

Antwort

81

Was 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); 
    } 
} 
+0

die Bitmap ich rotierenden bin ist nur für die Anzeige. Ich speichere es nie in einer Datei – Kevin

+3

Sie müssen es nicht speichern; das 'RotateFlip' wird den Trick machen. Sie können das 'using' entfernen und ein' return new Bitmap (img); ' –

+0

hinzufügen. Sie möchten vielleicht etwas Code von hier bekommen, um sicherzustellen, dass das JPEG mit einer höheren Qualitätsstufe gespeichert wird als der Standard 50 http://stackoverflow.com/questions/1484759/quality-of-a-saved-jpg-in-c-sharp –

8

Der Fehler ist in Ihrem ersten Anruf zu TranslateTransform:

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

Diese Bedürfnisse Transformation im Koordinatenraum von returnBitmap sein, anstatt b, so sollte das sein:

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

oder äquivalent

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

Ihre zweite TranslateTransform korrekt ist, weil es vor der Rotation angewendet wird.

Allerdings sind Sie wahrscheinlich besser dran mit der einfacheren RotateFlip Methode, wie Rubens Farias vorgeschlagen.

1

Ich kam und mit ein wenig Modifikation habe ich es zum Funktionieren gebracht. Ich fand einige andere Beispiele und bemerkte, dass etwas fehlte, was den Unterschied für mich ausmachte. Ich musste SetResolution aufrufen, wenn das Bild nicht die falsche Größe hatte. Ich bemerkte auch, dass die Höhe und die Breite rückwärts waren, obwohl ich denke, dass es für ein nicht quadratisches Bild eine gewisse Modifikation geben würde. Ich dachte mir, ich würde dies für jeden veröffentlichen, der mit dem gleichen Problem konfrontiert wird.

Hier ist mein 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); 
    } 
} 
Verwandte Themen