Поверните растровое изображение вокруг точки и сделайте эту точку новым центром - PullRequest
0 голосов
/ 24 сентября 2019

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

        Bitmap rotate(Bitmap img, float angle, int cx, int cy)
        {
            Bitmap result = new Bitmap(img.Width, img.Height);
            int middleX = img.Width / 2,
                middleY = img.Height / 2;
            using (Graphics g = Graphics.FromImage(result))
            {
                g.Clear(Color.Black);
                g.TranslateTransform(cx, cy);
                g.RotateTransform(angle);
                g.TranslateTransform(-cx, -cy);
                g.TranslateTransform(middleX - cx, middleY - cy); //shift (cx, cy) to be at the center, does not work
                g.DrawImage(originalImage, new Point(0, 0));
            }
            return result;
        }

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

Исходное изображение (красная точка - это точка вращения) - enter image description here

После поворота на 45 градусовизображение должно быть переведено так, чтобы красная точка была центром изображения

enter image description here

1 Ответ

0 голосов
/ 25 сентября 2019

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

    Bitmap rotate(Bitmap img, float angle, int cx, int cy)
    {
        Bitmap result = new Bitmap(img.Width, img.Height);
        int mx = img.Width / 2,
            my = img.Height / 2;
        using (Graphics g = Graphics.FromImage(result))
        {
            g.Clear(Color.Black);
            g.TranslateTransform(cx, cy);
            g.RotateTransform(angle);
            g.TranslateTransform(-cx, -cy);
            g.TranslateTransform(mx - cx, my - cy, MatrixOrder.Append);
            g.DrawImage(originalImage, new Point(0, 0));
        }
        return result;
    }
...