Как рассчитать область отсечения изображения после масштабирования и перевода

У меня есть изображение на холсте и ScaleTranform и TranslateTransform, прикрепленный к RenderTranform изображения. Таким образом, немного обработав события мыши, я могу перемещать и масштабировать изображение в пределах 350 на 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 ответа

Я думаю, что было бы просто математически взять текущие значения ScaleTransform и выяснить, каков фактический размер изображения в данный момент, и тогда вы знаете, что у вас есть ящик 350x450, который вы собираетесь вырезать из этого, вам просто нужно использовать текущий TranslateTransform, чтобы понять это. Просто имейте в виду, что вы используете для происхождения этих преобразований, потому что это то, из чего вам нужно рассчитать.

То, что я сказал выше, предполагает, что сначала у вас есть ScaleTransform в вашем RenderTransform, а во втором TranslateTransform. Порядок операций здесь имеет значение.

Просто примените вычисления, выполненные к изображению преобразованиями, к границам... (И сделайте это в том же порядке...)

Поэтому, если вы увеличите его в 2 раза по X и Y, результирующий холст будет 450/2 x 350/2 (по размеру - происхождение пока неизвестно)

И я предполагаю, что было бы легче избежать TranslateTransform и просто поиграть с Origin of the ScaleTransform... тогда как Origin 0 должен дать вам Clip-origin 0, а X&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 содержат данные, которые вы ищете!

С уважением, Дэйв

Другие вопросы по тегам