0

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

谢谢

4

2 回答 2

1

我认为获取当前的 ScaleTransform 值并计算出当时图像的实际大小是简单的数学运算,然后您知道您将要从中裁剪出一个 350x450 的框,你只需要使用当前的 TranslateTransform 来解决这个问题。请记住您用于这些变换的来源的内容,因为这就是您需要计算它的内容。

我上面所说的假设您在 RenderTransform 中首先有 ScaleTransform,然后是 TranslateTransform。操作的顺序在这里很重要。

于 2011-05-17T13:48:02.807 回答
0

只需将变换对图像所做的计算应用于边界......(并以相同的顺序进行......)

因此,如果您在 X 和 Y 中将其放大 2 倍,则生成的 Canvas 将为 450/2 x 350/2(尺寸 - 原点仍然未知)

而且我想避免 TranslateTransform 并简单地使用 ScaleTransform 的原点会更容易......而 0 的原点应该给你 0 的剪辑原点和 1 的 X&Y 原点将导致图像右下...

所以要设置一些简单的公式..:

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

问候,戴夫

于 2011-05-17T13:45:54.097 回答