С# поворот растрового изображения на 90 градусов
Я пытаюсь повернуть растровое изображение на 90 градусов, используя следующую функцию. Проблема заключается в том, что он отсекает часть изображения, когда высота и ширина не равны.
Обратите внимание на returnBitmap width = original.height и height = original.width
Может ли кто-нибудь помочь мне решить эту проблему или указать, что я делаю неправильно?
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;
}
Ответы
Ответ 1
Как насчет 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);
}
}
Ответ 2
Ошибка при первом вызове TranslateTransform
:
g.TranslateTransform((float)b.Width / 2, (float)b.Height / 2);
Это преобразование должно находиться в координатном пространстве returnBitmap
, а не b
, поэтому это должно быть:
g.TranslateTransform((float)b.Height / 2, (float)b.Width / 2);
или эквивалентно
g.TranslateTransform((float)returnBitmap.Width / 2, (float)returnBitmap.Height / 2);
Ваша вторая TranslateTransform
правильная, потому что она будет применена до поворота.
Однако вы, вероятно, лучше с более простым методом RotateFlip
, как предположил Рубенс Фариас.
Ответ 3
Я наткнулся и с небольшим изменением получил работу. Я нашел несколько других примеров и заметил, что что-то не так, что изменило для меня. Мне пришлось вызвать SetResolution, если бы я не сделал изображение, то получилось неправильное значение. Я также заметил, что высота и ширина были обратными, хотя я думаю, что в любом случае будет какая-то модификация для не квадратного изображения. Я решил, что опубликую это для всех, кто сталкивается с этим, как с той же проблемой.
Вот мой код
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);
}
}