2013-03-14 157 views
4

我想旋轉圖像..我有一個pictureBox 369x276。但是當我旋轉時,這個尺寸會減小。圖像調整時旋轉

在PictureBox sizeMode是PictureBoxSizeMode.StretchImage

這裏是我的代碼:

 Bitmap oldBitmap = (Bitmap)pictureBox1.Image; 
     float angle = 90; 
     var newBitmap = new Bitmap(oldBitmap.Width, oldBitmap.Height); 

     var graphics = Graphics.FromImage(newBitmap); 
     graphics.TranslateTransform((float)oldBitmap.Width/2, (float)oldBitmap.Height/2); 
     graphics.RotateTransform(angle); 
     graphics.TranslateTransform(-(float)oldBitmap.Width/2, -(float)oldBitmap.Height/2); 
     graphics.DrawImage(oldBitmap, new Point(0, 0)); 
     pictureBox1.Image = newBitmap; 

回答

2

只需使用RotateFlip:

Bitmap oldBitmap = (Bitmap)pictureBox1.Image; 
oldBitmap.RotateFlip(RotateFlipType.Rotate90FlipNone); 
pictureBox1.Image = oldBitmap; 

正如@丹-O指出,這允許旋轉System.Drawing.RotateFlipType枚舉中的任何一個度數。要在不損失大小的情況下以任意角度旋轉位圖,您可以執行以下操作,但它有點複雜!

一個 - 在WriteableBitmapEx庫添加到您的項目

兩個 - 添加XAML,WindowsBase和PresentationCore庫項目

- 使用下面的旋轉你的位圖的度數:

class Program 
{ 
    static void Main(string[] args) 
    { 
     Bitmap oldBitmap = (Bitmap)pictureBox1.Image;; 

     var bitmapAsWriteableBitmap = new WriteableBitmap(BitmapToBitmapImage(oldBitmap)); 
     bitmapAsWriteableBitmap.RotateFree(23); 

     var rotatedImageAsMemoryStream = WriteableBitmapToMemoryStream(bitmapAsWriteableBitmap); 
     oldBitmap = new Bitmap(rotatedImageAsMemoryStream); 
    } 

    public static BitmapImage BitmapToBitmapImage(Bitmap bitmap) 
    { 
     var memStream = BitmapToMemoryStream(bitmap); 
     return MemoryStreamToBitmapImage(memStream); 
    } 

    public static MemoryStream BitmapToMemoryStream(Bitmap image) 
    { 
     var memoryStream = new MemoryStream(); 
     image.Save(memoryStream, ImageFormat.Bmp); 

     return memoryStream; 
    } 

    public static BitmapImage MemoryStreamToBitmapImage(MemoryStream ms) 
    { 
     ms.Position = 0; 
     var bitmap = new BitmapImage(); 

     bitmap.BeginInit(); 

     bitmap.StreamSource = ms; 
     bitmap.CacheOption = BitmapCacheOption.OnLoad; 

     bitmap.EndInit(); 
     bitmap.Freeze(); 

     return bitmap; 
    } 

    private static MemoryStream WriteableBitmapToMemoryStream(WriteableBitmap writeableBitmap) 
    { 
     var ms = new MemoryStream(); 

     var encoder = new JpegBitmapEncoder(); 
     encoder.Frames.Add(BitmapFrame.Create(writeableBitmap)); 

     encoder.Save(ms); 

     return ms; 
    } 
} 

痛苦的屁股,但窩RKS!

+3

RotateFlip非常棒,如果你想要做的只是90度旋轉。 op的代碼可以處理任何角度。 – 2013-03-14 17:03:35

+0

thx很多。它的效果很好 – Ladessa 2013-03-14 17:11:39

+0

@ Dan-o非常真實,用一種稍微冗長的方式更新了我的答案,可以在不影響尺寸的情況下將圖像旋轉任意角度。 – JMK 2013-03-14 17:34:17

2

圖像尺寸越小越好。我從來沒有想過爲什麼,但Graphics.DrawImage真的只有當你提供它不僅是一個開始的位置,而且還有一個大小。其中一個重載允許您包含大小。