Asp.net 图像缩放几何
这与编程非常相关,但有点非编程问题。我在基于web的应用程序中执行图像缩放,我需要相对于固定位置维护我的图像,即使它通过左上角进行缩放。希望这张图片能使这成为可能。 其思想是,C是一个固定的位置,我希望将其作为缩放原点,而不是当前css行为的B。C可能在实际图像内,也可能不在实际图像内。因此,作为图像缩放,B需要相对于C移动。例如:如果图像缩放50%,则B将移动到C距离的1/2。如果图像增长到其大小的200%,则B将移动到距离C距离的两倍 在给定C的位置和图像的比例因子的情况下,最终寻找B的x&y公式。不确定图像的大小需要是这个的一部分,但我有它,如果需要的话 谢谢你的帮助 我知道的事情: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
因此,您希望图像中当前位于
(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)
- 戴夫
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));
}
}