Я пытаюсь повернуть битовый массив 90 градусов с помощью следующей функции. Проблема с ним состоит в том, что это отключает часть изображения, когда высота и ширина не равны.
Заметьте returnBitmap ширину = original.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;
}
А как насчет этого :
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);
}
}
Ошибка в первом вызове 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
, как предлагал Рубенс Фариас.