2010-02-08 12 views
40

Sto provando a ruotare una bitmap di 90 gradi utilizzando la seguente funzione. Il problema è che taglia parte di un'immagine quando l'altezza e la larghezza non sono uguali.C# ruota la bitmap di 90 gradi

Avviso del returnBitmap width = original.height ed è height = original.width

Qualcuno può aiutarmi a risolvere questo problema o sottolineare quello che sto facendo male?

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

risposta

81

Che dire 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

bitmap sto rotante è solo per scopi di visualizzazione. Non l'ho mai salvato in un file – Kevin

+3

non è necessario salvarlo; che "RotateFlip" farà il trucco. Puoi rimuovere quel 'using' e aggiungere un' return new Bitmap (img); ' –

+0

Potresti voler ottenere del codice da qui per assicurarti che il jpeg sia salvato con un livello di qualità superiore rispetto al 50 http predefinito://stackoverflow.com/questions/1484759/quality-of-a-saved-jpg-in-c-sharp –

8

il bug è nel vostro prima chiamata a TranslateTransform:

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

questa trasformazione ha bisogno di essere nello spazio di coordinate del returnBitmap piuttosto che b, quindi dovrebbe essere:

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

o equivalentemente

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

tuo secondo TranslateTransform è corretto, perché sarà applicato prima della rotazione.

Tuttavia, probabilmente stai meglio con il più semplice metodo RotateFlip, come suggerito da Rubens Farias.

1

Mi sono imbattuto e con una piccola modifica ho avuto modo di funzionare. Ho trovato alcuni altri esempi e ho notato che mancava qualcosa che ha fatto la differenza per me. Ho dovuto chiamare SetResolution, se non l'immagine fosse finita con le dimensioni sbagliate. Ho anche notato che l'altezza e la larghezza erano all'indietro, anche se penso che ci sarebbe comunque qualche modifica per un'immagine non quadrata. Ho pensato di postare questo per chiunque si imbatta in questo come ho fatto con lo stesso problema.

Ecco il mio codice

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