如何在缩放和翻译后计算图像的剪切区域

时间:2011-05-17 13:37:11

标签: wpf crop image-clipping

我在画布上有一个图像,并且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>

由于

2 个答案:

答案 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包含您要查找的数据!

的问候,  戴夫