none
关于GDI+自定义绘制旋转的问题 RRS feed

  • 问题

  • 就是说,为何在控件的Onpaint事件中使用GDI+中的函数比如RotateTransform来进行翻转,为何没有效果。求知道的大神给点提示,谢谢大家了!!!

    Graphics g = this.frmTestControlTranlate1.CreateGraphics();
                g.RotateTransform(60, System.Drawing.Drawing2D.MatrixOrder.Prepend);
                this.frmTestControlTranlate1.Invalidate();

    2017年9月4日 3:55

答案

  • Hi,

    根据MSDN的规矩,一个帖子只能解决一个问题,有这个帖子延伸出来的问题,我建议去开一个新帖,这样也会有跟多的社区成员进来,帮助解决问题。

    如果你把之前的给擦出,那还怎么知道你是旋转得到的呢?没有对比了。 找一个角度画,在画之前把之前的擦出,就可以了。 就不需要我那么多代码了。

    如果你开贴,我建议能上传一份能重现问题的代码到 one drive上面,这样能方便快速的解决问题。

    Best Regards,

    Hart


    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年9月6日 8:53
    版主
  • Hi,

    很高兴听到你已经明白问题的关键所在.  根据我提供的文档,你可以看到它是在2D里面的类库。

    微软在图形方面,有DX,2D,3D 有机会你可以上网查查资料,干活满满的 。 

    Best Regards,

    Hart


    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年9月6日 9:03
    版主
  • Hi,

    你可以尝试使用 Matrix  来达到选择矩形的效果,函数如下

    public void RotateRectangle(Graphics g, Rectangle r, float angle) {
      using (Matrix m = new Matrix()) {
        m.RotateAt(angle, new PointF(r.Left + (r.Width / 2),
                                  r.Top + (r.Height / 2)));
        g.Transform = m;
        g.DrawRectangle(Pens.Black, r);
        g.ResetTransform();
      }
    }

    然后再执行下面的函数。

    RotateRectangle(g, r1, 45);
    RotateRectangle(g, r2, 85);

    最后调用绘制函数。

    g.DrawLine(Pens.Black, new Point(r1.Left + r1.Width / 2, r1.Top + r1.Height / 2),
                           new Point(r2.Left + r2.Width / 2, r2.Top + r2.Height / 2));

    Best Regards,

    Hart



    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年9月6日 7:53
    版主
  • 谢谢大神的耐心指点!我恍然大悟,豁然开朗!犹如醍醐灌顶,大彻大悟!!
    2017年9月6日 9:14

全部回复

  • Graphics还要给它元素(例如点阵,你汞个只是告诉它指令,但它不知道要转什麽,请参考我以下的例子:

    public static Bitmap RotateImage(Bitmap b, float angle)
    {
      //create a new empty bitmap to hold rotated image
      Bitmap returnBitmap = new Bitmap(b.Width, b.Height);
      //make a graphics object from the empty bitmap
      using(Graphics g = Graphics.FromImage(returnBitmap)) 
      {
          //move rotation point to center of image
          g.TranslateTransform((float)b.Width / 2, (float)b.Height / 2);
          //rotate
          g.RotateTransform(angle);
          //move image back
          g.TranslateTransform(-(float)b.Width / 2, -(float)b.Height / 2);
          //draw passed in image onto graphics object
          g.DrawImage(b, new Point(0, 0)); 
      }
      return returnBitmap;
    }


    2017年9月4日 7:43
  • Hi,

    感谢你在MSDN论坛发帖。

    你有得到什么错误信息吗? 你能提供一份可以重现问题的demo吗? 到one drive上面吗?

    如果你使用RotateTransform(Single) 这个函数呢?  你又切换这个append这个属性吗?

    这边有两个demo,都是使用rotate transform来解决旋转,都是好的。

    Rotation transformer example

    C# Image/PictureBox Rotations

    Best Regards,

    Hart


    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年9月4日 7:44
    版主
  • 你这个是对图片进行旋转,但是我想能否对自己绘制的一个矩形旋转一定的角度,不知道怎么做?还请您耐心指点一下。

    部分代码如下:

      private Rectangle rtl = new Rectangle();
            private Point centerPos = new Point();
            protected override void OnPaint(PaintEventArgs e)
            {
                Graphics g = e.Graphics;
                rtl = new Rectangle(100, 100, 300, 80);
                g.DrawRectangle(Pens.Red, rtl);

                //Matrix m = new Matrix();
                //int rotation = 30;
                //m.RotateAt(rotation, new PointF(pathBounds.Left + (pathBounds.Width / 2), pathBounds.Top + (pathBounds.Height / 2)), MatrixOrder.Append);
                
                g.TranslateTransform((float)this.Width / 2, (float)this.Height / 2);
                //rotate
                g.RotateTransform(60);
                //move image back
                g.TranslateTransform(-(float)this.Width / 2, -(float)this.Height / 2);

    我想问的是能否对rtl 这个绘制的矩形进行旋转呢?

    如图所示(能否对其中红色的矩形做旋转呢?!恳请大神,大牛,大虾,大圣们给个解释!):


    2017年9月6日 7:33
  • Hi,

    你可以尝试使用 Matrix  来达到选择矩形的效果,函数如下

    public void RotateRectangle(Graphics g, Rectangle r, float angle) {
      using (Matrix m = new Matrix()) {
        m.RotateAt(angle, new PointF(r.Left + (r.Width / 2),
                                  r.Top + (r.Height / 2)));
        g.Transform = m;
        g.DrawRectangle(Pens.Black, r);
        g.ResetTransform();
      }
    }

    然后再执行下面的函数。

    RotateRectangle(g, r1, 45);
    RotateRectangle(g, r2, 85);

    最后调用绘制函数。

    g.DrawLine(Pens.Black, new Point(r1.Left + r1.Width / 2, r1.Top + r1.Height / 2),
                           new Point(r2.Left + r2.Width / 2, r2.Top + r2.Height / 2));

    Best Regards,

    Hart



    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年9月6日 7:53
    版主
  • Hi,

    你可以尝试使用 Matrix  来达到选择矩形的效果,函数如下

    public void RotateRectangle(Graphics g, Rectangle r, float angle) {
      using (Matrix m = new Matrix()) {
        m.RotateAt(angle, new PointF(r.Left + (r.Width / 2),
                                  r.Top + (r.Height / 2)));
        g.Transform = m;
        g.DrawRectangle(Pens.Black, r);
        g.ResetTransform();
      }
    }

    然后再执行下面的函数。

    RotateRectangle(g, r1, 45);
    RotateRectangle(g, r2, 85);

    最后调用绘制函数。

    g.DrawLine(Pens.Black, new Point(r1.Left + r1.Width / 2, r1.Top + r1.Height / 2),
                           new Point(r2.Left + r2.Width / 2, r2.Top + r2.Height / 2));

    Best Regards,

    Hart



    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    那么,大神,你的代码确实可以用,也是我想要的答案,就是关于你写的这一段代码,有什么资料上面有详解吗?我想仔细看看!!!或者您愿意的话,可以给我仔细解释一番吗?本小菜洗耳恭听!!


    2017年9月6日 8:25
  • 还有个问题,就是使用您的这个代码翻转之后,为何之前的图画还在,怎么清空!,是要通过Clear(Color)和Invalidate来处理吗?

    还是有什么其它的更好的方法来处理此问题呢?!

    您看现象如下:


    2017年9月6日 8:31
  • Hi,

    第一眼看到这个问题,我以为没有办法实现,因为是笔已经把图形绘制好了,而且坐标也是固定好的,不怎么好旋转。

    所以我认为解决问题的关键是 Matrix  。 

    Applies a clockwise rotation about the specified point to this Matrix by prepending the rotation.

    申请一个旋转关于特殊的点,为了准备旋转。(翻译的可能不好)

    Best Regards,

    Hart


    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年9月6日 8:39
    版主
  • 之前图画还在的问题可以通过以下代码解决: this.CreateGraphics().Clear(SystemColors.Control);

    但是,您刚才说的 Matrix 这个对象,能详细解说以下它的使用方式吗?!

    2017年9月6日 8:50
  • Hi,

    根据MSDN的规矩,一个帖子只能解决一个问题,有这个帖子延伸出来的问题,我建议去开一个新帖,这样也会有跟多的社区成员进来,帮助解决问题。

    如果你把之前的给擦出,那还怎么知道你是旋转得到的呢?没有对比了。 找一个角度画,在画之前把之前的擦出,就可以了。 就不需要我那么多代码了。

    如果你开贴,我建议能上传一份能重现问题的代码到 one drive上面,这样能方便快速的解决问题。

    Best Regards,

    Hart


    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年9月6日 8:53
    版主
  • 恩,多谢大牛,我仔细看了一下代码,我明白了!!!
    2017年9月6日 8:57
  • Hi,

    很高兴听到你已经明白问题的关键所在.  根据我提供的文档,你可以看到它是在2D里面的类库。

    微软在图形方面,有DX,2D,3D 有机会你可以上网查查资料,干活满满的 。 

    Best Regards,

    Hart


    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年9月6日 9:03
    版主
  • 谢谢大神的耐心指点!我恍然大悟,豁然开朗!犹如醍醐灌顶,大彻大悟!!
    2017年9月6日 9:14