Поворот изображения по часовой стрелке и против часовой стрелки с помощью Translate Transform в c # - PullRequest
3 голосов
/ 01 ноября 2011

Я использую следующий код для поворота изображения на угол, принимая центральную точку в качестве начала координат.

private Bitmap rotateImage(Bitmap b, float angle)
{
       Bitmap returnBitmap = new Bitmap(b.Width, b.Height);
       Graphics g = Graphics.FromImage(returnBitmap);
       g.TranslateTransform((float)b.Width/2, (float)b.Height / 2);
       g.RotateTransform(angle);
       g.TranslateTransform(-(float)b.Width/2,-(float)b.Height / 2);
       g.DrawImage(b, new Point(0, 0));
       return returnBitmap;
} 

Проблема возникает, когда я пытаюсь восстановить исходное значение изображения послеПоворот выполняется. Я намерен сделать это, повернув изображение снова на угол (360-градусный поворот). Но это не работает, и края изображения кажутся обрезанными.Есть ли лучшее решение для поворота изображения в c #. Я просто хочу повернуть изображение на угол без аберрации в стороны, а затем повернуть изображение на противоположный угол, чтобы отменить примененное вращение, поэтому предыдущее изображение восстанавливается.

1 Ответ

2 голосов
/ 02 ноября 2011

Прежде всего, как уже было сказано в комментариях, вам нужно создать увеличенное целевое растровое изображение для размещения повернутого растрового изображения. Это даст вам правильный новый размер:

public Size SizeAfterRotation(Size sz, float angle)
{
    var m = new Matrix();
    m.Rotate(angle);
    var pts = new[]
                  {
                      new Point(sz.Width, sz.Height),
                      new Point(sz.Width, 0)
                  };
    m.TransformPoints(pts);
    return new Size(
        Math.Max(Math.Abs(pts[0].X), Math.Abs(pts[1].X)),
        Math.Max(Math.Abs(pts[0].Y), Math.Abs(pts[1].Y)));
}

Тогда, что касается восстановления (вращения назад) растрового изображения, я бы не советовал вам делать это. Попробуйте вместо этого сохранить оригинальное растровое изображение. Восстановить его будет непросто, и если вам это удастся, вы все равно потеряете качество изображения.

...