Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.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
Asp.net 图像缩放几何_Asp.net_Css_Geometry - Fatal编程技术网

Asp.net 图像缩放几何

Asp.net 图像缩放几何,asp.net,css,geometry,Asp.net,Css,Geometry,这与编程非常相关,但有点非编程问题。我在基于web的应用程序中执行图像缩放,我需要相对于固定位置维护我的图像,即使它通过左上角进行缩放。希望这张图片能使这成为可能。 其思想是,C是一个固定的位置,我希望将其作为缩放原点,而不是当前css行为的B。C可能在实际图像内,也可能不在实际图像内。因此,作为图像缩放,B需要相对于C移动。例如:如果图像缩放50%,则B将移动到C距离的1/2。如果图像增长到其大小的200%,则B将移动到距离C距离的两倍 在给定C的位置和图像的比例因子的情况下,最终寻找B的x

这与编程非常相关,但有点非编程问题。我在基于web的应用程序中执行图像缩放,我需要相对于固定位置维护我的图像,即使它通过左上角进行缩放。希望这张图片能使这成为可能。

其思想是,C是一个固定的位置,我希望将其作为缩放原点,而不是当前css行为的B。C可能在实际图像内,也可能不在实际图像内。因此,作为图像缩放,B需要相对于C移动。例如:如果图像缩放50%,则B将移动到C距离的1/2。如果图像增长到其大小的200%,则B将移动到距离C距离的两倍

在给定C的位置和图像的比例因子的情况下,最终寻找B的x&y公式。不确定图像的大小需要是这个的一部分,但我有它,如果需要的话

谢谢你的帮助

我知道的事情:

  • 我知道这座桥的宽度和高度 图像矩形
  • 我知道B和A的偏移量
  • 我知道C和A的偏移量
  • 我知道以图像百分比表示的比例因子

  • 因此,您希望图像中当前位于
    (C_x,C_y)
    的点
    C
    在按
    s
    的因子缩放图像后保持在相同的位置

    C
    的新位置,例如,
    C\u New=(s*C\u x,s*C\u y)

    您希望移动图像,以便
    C_new=C

    这意味着您必须将
    B=(B_x,B_y)
    移动
    (s*C_x-C_x,s*C_y-C_y)
    ,或者图像的新原点,例如
    B_new

    B_new = (B_x + s*C_x-C_x,  B_y + s*C_y-C_y)
    

    因此,现在您可以在
    B_new
    ---处显示缩放图像,
    C
    应保持不变。

    首先需要计算从B到C的距离,然后将其更改为缩放,这就是新B相对于C的位置:

    newB = C - (C - B) * scale
    
    当你想要坐标时,x和y的函数是一样的:

    newBx = Cx - (Cx - Bx) * scale
    newBy = Cy - (Cy - By) * scale
    

    (使用的比例值不是百分比,而是大小乘数。大小增加50%将给出
    1.5

    有效地,您希望将C视为原点,只需按比例量“移动”B即可。通过将其视为从C到B的向量,并按所讨论的量对其进行缩放,您可以相当容易地做到这一点

    newBx = Cx - (Cx - Bx) * scale;
    newBy = Cy - (Cy - By) * scale;
    
    例如,比例为0.5(50%)时,将变成:

    newBx = 100 - (100 - 50) * 0.5 
          = 100 - 25
          = 75                 // 1/2 the distance to C
    newBy = 100 - (100 - 25) * 0.5
          = 100 - 37.5
          = 62.5               // 1/2 the distance to C
    
    评分为2分(200%):


    如果我理解这个问题:

    X(b) = X(c) - Width*(1/3)    
    Y(b) = Y(c) - Height*(3/4)
    
    这个公式看起来很简单,但是在超出Y=0(我假设是你的北方极限)之前,你的样本图像不能大于133x200(比例=133%)

    如果您想阻止它越过Y=0或X=0,并在到达任一极限后进一步向南和向东推进,一种方法可能是:

    IIF(Height > 133, Y(b) = 0, Y(b) = Y(c) - Height*(3/4))
    IIF(Width > 450, X(b) = 0, X(b) = X(c) - Width*(1/3))
    
    我认为比例应该转换为高度和宽度,而不是在这些公式中使用比例作为变量,因为原始图像可以是任意大小(假设每个样本的比例不总是100x150)

    • 戴夫
    这里有一个C#代码片段,经过测试可以正常工作:

    void Main()
    {
        Application.Run(new form1());
    }
    
    public class form1 : Form
    {
        static Point C = new Point(100,100);
        static Point origLocB = new Point(50,25);
        static Size origSizeB = new Size(150,100);
    
        Panel Rec = new Panel() 
        {
            Left = origLocB.X, 
            Top = origLocB.Y, 
            Width = origSizeB.Width, 
            Height = origSizeB.Height,
            BorderStyle = BorderStyle.FixedSingle,
        };
    
        NumericUpDown nud = new NumericUpDown()
        {
            Value = 1M,
            Increment = .01M,
            DecimalPlaces = 2,
            Dock = DockStyle.Bottom,
        };
    
        public form1()
        {
            nud.ValueChanged += NumericUpDown_ValueChanged;
            Controls.Add(nud);
            Controls.Add(Rec);
        }
    
        public void NumericUpDown_ValueChanged(object sender, EventArgs e)
        {
            Rec.Location = new Point(((int)((origLocB.X - C.X) * nud.Value + C.X)),
                                    ((int)((origLocB.Y - C.Y) * nud.Value + C.Y)));
            Rec.Size = new Size((int)(origSizeB.Width*nud.Value),
                                (int)(origSizeB.Height*nud.Value));
        }
    }
    

    这真的只是echo@Reed的回答

    这里有什么问题?你不能缩放图像,然后根据C定位吗?什么是“缩放原点”?这是一个想法,但我不知道需要什么样的公式才能做到这一点。图像定位在B,但B需要在缩放时移动,移动是相对于C的,而不是A。这基本上是正确的-如果你去掉“-1”-只需乘以缩放,它就能正常工作。(现在,因子为0.5的newBx变成了“100-(100-50)(0.5-1)”,或100-(50*-0.5)或125。如果你去掉-1,它将是75,这是预期值。@Reed:是的,你是对的。我更正了这个表达式。我看到你在回答中使用了它。:)很抱歉-我等了好一个小时,然后决定给出正确的答案;)里德,这是一个循环。假设y从s=1到s=2(你上面的例子),你得到-50,这是正确的。但是,如果现在从-50值开始并缩放回1,则应该返回到不使用公式的By=100值。100 - (100- -50) * 1 = 100 - 150 = -50;@安德鲁:这是从“当前”的规模。如果你想开始一个新的循环,你需要缩小原始值,或者让“0.5->1.0”成为一个2.0的新比例。
    void Main()
    {
        Application.Run(new form1());
    }
    
    public class form1 : Form
    {
        static Point C = new Point(100,100);
        static Point origLocB = new Point(50,25);
        static Size origSizeB = new Size(150,100);
    
        Panel Rec = new Panel() 
        {
            Left = origLocB.X, 
            Top = origLocB.Y, 
            Width = origSizeB.Width, 
            Height = origSizeB.Height,
            BorderStyle = BorderStyle.FixedSingle,
        };
    
        NumericUpDown nud = new NumericUpDown()
        {
            Value = 1M,
            Increment = .01M,
            DecimalPlaces = 2,
            Dock = DockStyle.Bottom,
        };
    
        public form1()
        {
            nud.ValueChanged += NumericUpDown_ValueChanged;
            Controls.Add(nud);
            Controls.Add(Rec);
        }
    
        public void NumericUpDown_ValueChanged(object sender, EventArgs e)
        {
            Rec.Location = new Point(((int)((origLocB.X - C.X) * nud.Value + C.X)),
                                    ((int)((origLocB.Y - C.Y) * nud.Value + C.Y)));
            Rec.Size = new Size((int)(origSizeB.Width*nud.Value),
                                (int)(origSizeB.Height*nud.Value));
        }
    }