Поворот изображений в C#
Эта программа использует следующий способ RotateBitmap для поворота изображения.
// Вернуть растровое изображение, повернутое вокруг его центра. private Bitmap RotateBitmap(Bitmap bm, float angle) { // Сделать матрицу для представления вращения // под этим углом. Matrix rotate_at_origin = new Matrix(); rotate_at_origin.Rotate(angle); // Поворачиваем углы изображения, чтобы увидеть, насколько велика // это будет после вращения. PointF[] points = { new PointF(0, 0), new PointF(bm.Width, 0), new PointF(bm.Width, bm.Height), new PointF(0, bm.Height), }; rotate_at_origin.TransformPoints(points); float xmin, xmax, ymin, ymax; GetPointBounds(points, out xmin, out xmax, out ymin, out ymax); // Сделайте растровое изображение, чтобы удерживать повернутый результат. int wid = (int)Math.Round(xmax - xmin); int hgt = (int)Math.Round(ymax - ymin); Bitmap result = new Bitmap(wid, hgt); // Создаем реальное преобразование вращения. Matrix rotate_at_center = new Matrix(); rotate_at_center.RotateAt(angle, new PointF(wid / 2f, hgt / 2f)); // Нарисуем изображение на новом растровом изображении. using (Graphics gr = Graphics.FromImage(result)) { // Использование гладкой интерполяции изображений. gr.InterpolationMode = InterpolationMode.High; // Очистите цвет в верхнем левом углу изображения. gr.Clear(bm.GetPixel(0, 0)); //// Для отладки. (Легче видеть фон.) //gr.Clear(Color.LightBlue); // Настройте преобразование для поворота. gr.Transform = rotate_at_center; // Нарисуем изображение, центрированное по растровому изображению. int x = (wid - bm.Width) / 2; int y = (hgt - bm.Height) / 2; gr.DrawImage(bm, x, y); } // Вернуть растровое изображение результата. return result; }
Когда вы поворачиваете прямоугольник, результат может быть более широким и более высоким, чем исходное изображение, поскольку поворотные углы могут торчать по бокам. Этот метод возвращает новое изображение, которое достаточно велико, чтобы отображать все содержимое исходного изображения.
Чтобы получить размеры повернутого изображения, код начинается с создания Matrix, который вращается по указанному углу. Он создает массив структур PointF, поддерживающих углы растрового изображения, и использует Matrix для поворота углов.
Затем метод вызывает метод GetPointBounds, чтобы получить границы для повернутых углов. Этот метод просто перебирает точки и сохраняет следы, а также минимальные и максимальные значения X и Y. Этот метод прост, поэтому он не показан здесь.
Далее код создает растровое изображение результата, достаточно большое, чтобы удерживать повернутое изображение. Затем он создает матрицу Matrix для представления вращения через нужный угол вокруг центра растрового изображения результата.
Затем метод создает объект Graphics, связанный с растровым изображением результата, и устанавливает свойство объекта InterpolationMode объекта для получения плавного результата. Код очищает растровое изображение результата с любым цветом в верхнем левом углу исходного изображения. (Прокомментированный код отладки заполняет растровое изображение результата светло-голубым цветом, поэтому легко увидеть, где рисуется исходное изображение.)
Далее код устанавливает свойство Graphics объекта Graphics, чтобы он вращал все, что он рисует. Наконец, метод рисует исходное растровое изображение в позиции, которая делает его центрированным по растровому изображению результата. Преобразование автоматически поворачивает изображение.