图像调整时旋转
问题描述:
我想旋转图像..我有一个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;
答
只需使用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!
答
图像尺寸越小越好。我从来没有想过为什么,但Graphics.DrawImage
真的只有当你提供它不仅是一个开始的位置,而且还有一个大小。其中一个重载允许您包含大小。
RotateFlip非常棒,如果你想要做的只是90度旋转。 op的代码可以处理任何角度。 – 2013-03-14 17:03:35
thx很多。它的效果很好 – Ladessa 2013-03-14 17:11:39
@ Dan-o非常真实,用一种稍微冗长的方式更新了我的答案,可以在不影响尺寸的情况下将图像旋转任意角度。 – JMK 2013-03-14 17:34:17