【问题标题】:Rotate Bitmap around point and make that point the new center围绕点旋转位图并使该点成为新中心
【发布时间】:2020-01-24 22:41:15
【问题描述】:

我想围绕给定点旋转位图,并让该点成为位图的新中心。
这是我首先尝试的

        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;
        }

但是当我去翻译旋转后的图像时,翻译是在原始空间而不是这个新的旋转空间中,并且不正确。 我基本上尝试了我能想到的每一种组合,但没有运气。搜索结果只描述了如何围绕一个点旋转。

原图(红点是要旋转的点)-

图像旋转 45 度后应平移,使红点成为图像的中心

【问题讨论】:

  • 请澄清您所说的“成为位图的新中心”是什么意思。最好提供小样本图像,显示所需操作的“之前”和“之后”。此外,请确保您提供了一个良好的minimal reproducible example,以准确显示您尝试过的内容(如果您提供图像,MCVE 不需要包含位图数据本身,因为可以从发布的图像中获得)。
  • 先把点平移到中心,再做旋转!
  • @TaW 我试过了,但没有用。当我再次回到家时,我可以发布我尝试过的代码。
  • 未经测试的伪代码:translate(-red);translate(-center);rotate(angle);translate(center)
  • 并非如此。这个g.Clear(Color.Black); g.TranslateTransform(middleX, middleY); g.RotateTransform(angle); g.TranslateTransform(-middleX, -middleY); g.TranslateTransform(middleX - cx, middleY -cy); g.DrawImage(img, 0, 0); 也可以使用..

标签: c# image rotation gdi+


【解决方案1】:

您必须将矩阵顺序设置为追加才能进行最终翻译。我不知道为什么这是使它起作用的原因。我实际上只是蛮力尝试了一切可能的方法,直到它起作用为止。不过,我仍然有兴趣解释正在发生的事情。

    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;
    }

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-22
  • 2013-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-14
相关资源
最近更新 更多