我在画布上有一个图像,并且ScaleTranform和TranslateTransform附加到图像的RenderTranform。因此,通过一些鼠标事件处理,我可以在画布的350 x 450范围内移动和缩放图像。
在进行一些缩放和平移之后,如何计算原始BitmapImage上的剪切矩形,以及屏幕上可见区域的剪切矩形。我想裁剪原始的BitmapImage。
<Border BorderBrush="Black" BorderThickness="2">
<Canvas Name="canvas" ClipToBounds="True" Height="450" Width="350">
<Image Name="image" Opacity="1" RenderTransformOrigin="0.5,0.5" Height="450" Width="350">
<Image.Source>
<BitmapImage UriSource="test.jpg"/>
</Image.Source>
</Image>
</Canvas>
</Border>
由于
答案 0 :(得分:1)
我认为采用当前的ScaleTransform值并计算当时图像的实际大小是简单的数学,然后你知道你有一个350x450的盒子,你将要裁剪出来其中,你只需要使用当前的TranslateTransform来解决这个问题。请记住您正在使用的这些变换的起源,因为这是您需要从中进行计算的。
我上面所说的假设您在RenderTransform中首先使用ScaleTransform,在第二个中使用TranslateTransform。操作顺序在这里很重要。
答案 1 :(得分:0)
只需将通过转换完成的图像计算应用到边界... (并按相同的顺序进行......)
因此,如果在X和Y中将其放大2倍 得到的Canvas将是450/2 x 350/2(大小 - 原点仍然未知)
我想我可以更容易地避免使用TranslateTransform并简单地使用 ScaleTransform的原点......而Origin的0应该给你一个Clip-origin为0 并且X&amp; Y Origin为1将导致图像在右下方......
所以设置一些简单的公式..:
double W = 450;
double H = 350;
double SX = 2;
double SY = 2;
double OX = .3;
double OY = .3;
double newW = W / SX;
double newH = H / SY;
double newX = (W-newW) * OX;
double newY = (H-newH) * OY;
所以newX,Y,W和H包含您要查找的数据!
的问候, 戴夫