Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 图像旋转不可预测地移动生成的图像_C#_.net_Gdi+_Gdi_System.drawing - Fatal编程技术网

C# 图像旋转不可预测地移动生成的图像

C# 图像旋转不可预测地移动生成的图像,c#,.net,gdi+,gdi,system.drawing,C#,.net,Gdi+,Gdi,System.drawing,我一直在到处找,所以今天我找不到任何适合我需要的东西 我有一个web应用程序,让用户拖放文本/图像,然后将详细信息发送到服务器,将其绘制成pdf。我正在尝试启用旋转,但我无法掌握translatetransform的内容。我在测试中的图像打印得很好,旋转得很好,但它不在正确的位置。我不知道最初的翻译是如何改变事情的,我的头脑在一天结束时被打爆了。我是否必须先使用不同的图形实例将其绘制为位图,然后将该位图绘制到我的背景中?这方面的任何帮助都会很好!谢谢 代码: i是浏览器中的图像对象 坐标是浏览

我一直在到处找,所以今天我找不到任何适合我需要的东西

我有一个web应用程序,让用户拖放文本/图像,然后将详细信息发送到服务器,将其绘制成pdf。我正在尝试启用旋转,但我无法掌握translatetransform的内容。我在测试中的图像打印得很好,旋转得很好,但它不在正确的位置。我不知道最初的翻译是如何改变事情的,我的头脑在一天结束时被打爆了。我是否必须先使用不同的图形实例将其绘制为位图,然后将该位图绘制到我的背景中?这方面的任何帮助都会很好!谢谢

代码:

  • i是浏览器中的图像对象
  • 坐标是浏览器画布(990wx1100h)上图像上角的x&y
  • 大小是浏览器上图元的h&w

                            Bitmap b = new Bitmap(wc.OpenRead(i.img));
                            if (i.rotation != 0)
                            {
                                g.TranslateTransform(this.CanvasDetails.size.width/2, this.CanvasDetails.size.height/2);
                                g.RotateTransform(i.rotation);
                                g.DrawImage(b, new Rectangle(- i.coord.x/2, -i.coord.y/2, i.size.width, i.size.height), 0, 0, b.Width, b.Height, GraphicsUnit.Pixel, ia);
                            }
                            else
                            {
                                g.DrawImage(b, new Rectangle(i.coord.x, i.coord.y, i.size.width, i.size.height), 0, 0, b.Width, b.Height, GraphicsUnit.Pixel, ia);
                            }
    
    编辑 我按照Adam的建议添加了translateTransform反转,但图像仍然绘制在不同的位置

                                    g.TranslateTransform(this.CanvasDetails.size.width / 2, this.CanvasDetails.size.height / 2);
                                g.RotateTransform(i.rotation);
                                g.TranslateTransform(-this.CanvasDetails.size.width / 2, -this.CanvasDetails.size.height / 2);
                                g.DrawImage(b, new Rectangle(-i.coord.x / 2, -i.coord.y / 2, i.size.width, i.size.height), 0, 0, b.Width, b.Height, GraphicsUnit.Pixel, ia);
    
示例: 浏览器视图

.NET绘图版本

好的,完全修改这个答案,试图解释得更清楚。需要知道的是,变换“累积”和旋转变换发生在原点周围。因此,为了解释累积(乘法)变换的影响,请看以下示例:

            //draw an ellipse centered at 200,200
            g.DrawEllipse(Pens.Red, 195, 195, 10, 10);

            //apply translate transform - shifts origin to 200,200
            g.TranslateTransform(200, 200);

            //draw another ellipse, should draw around first ellipse
            //because translate tranforms essentially moves our coordinates 200,200
            g.DrawEllipse(Pens.Blue, -7, -7, 14, 14);

            //now do rotate transform
            g.RotateTransform(90f); //degree to rotate object

            //now, anything we draw with coordinates 0,0 is actually going to be draw at 200,200 AND be rotated by 45*
            //this line will be vertical, through 200,200, instead of horizontal through 0,0
            g.DrawLine(Pens.Green, -20,0,20,0);

            //If we add another translate, this time 50x, it would normally translate by 50 in the X direction
            //BUT - because we already have transforms applied, including the 90 rotate, it affects this translation
            //so this in effect because a 50px translation in Y, because it's rotated 90*
            g.TranslateTransform(50, 0);

            //so even though we translated 50x, this line will draw 50px below the last line
            g.DrawLine(Pens.Green, -20, 0, 20, 0);
因此,对于您的情况,您需要绘制一个以中心点为中心并按角度旋转的对象。所以你会这样做:

g.TranslateTransform(-CenterPoint.X, -CenterPoint.Y);
g.RotateTransform(Angle);
g.DrawImage(b, -ImageSize/2, -ImageSize/2, ImageSize, ImageSize);
然后,您需要重置其他图形的变换,您可以使用:

g.ResetTransform();

如果图像没有保留在您想要的位置,那么您需要检查用于定位图像的值。您是否正在存储它的中心?还是左上角?等等。

不幸的是,这不起作用。”CanvasDetails'是我在上面绘制图像的背景。我真的很困惑。我是否应该将drawimage与矩形一起使用?我不知道该如何把这个应用到jive上。你能多放一点你的代码和一个更好的例子来说明你的web和.net方面有什么不同吗?这可能是多个转换的问题,但是如果没有更多的代码,就很难准确地看到具体的细节,我现在就试试看,看看我能做些什么。我真的很欣赏这额外的洞察力!谢谢非常感谢你,伙计。你的解释真的很有帮助,我刚刚开始工作。你真的帮助了我,我非常感激。如果你在纽约,给我发个短信,我会给你买瓶啤酒!再次感谢!别担心。我建议您考虑使用矩阵来存储从web应用程序到其他应用程序的翻译/转换/旋转等,尽管它更干净,也不太容易出现问题。