2013-03-14 103 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真的只有当你提供它不仅是一个开始的位置,而且还有一个大小。其中一个重载允许您包含大小。